分块30pts求助
查看原帖
分块30pts求助
304550
black_trees楼主2021/12/11 15:36

RT,对拍没查出来为啥(

只过了前三个点

不知道是因为对拍写错了还是什么其它的问题


#include<bits/stdc++.h>
using namespace std;

constexpr int si=1e5+10;
int n,q,t;
long long a[si],add[si],sum[si];
int belong[si];
int L[si],R[si];

inline void change(int l,int r,long long v){
	int p=belong[l],q=belong[r];
	if(p==q){
		for(register int i=l;i<=r;++i){
			a[i]+=v;
		} sum[p]+=1ll*(r-l+1)*v;
	}
	else{
		for(register int i=l;i<=R[p];++i){
			a[i]+=v;
		} sum[p]+=1ll*(R[p]-l+1)*v;
		for(register int i=L[q];i<=r;++i){
			a[i]+=v;
		} sum[p]+=1ll*(r-L[q]+1)*v;
		for(register int i=p+1;i<=q-1;++i){
			add[i]+=v;
		}
	}
}
inline long long query(int l,int r){
	int p=belong[l],q=belong[r];
	long long res=0;
	if(p==q){
		for(register int i=l;i<=r;++i){
			res+=a[i];
		} res+=(r-l+1)*1ll*add[p];
	}
	else{
		for(register int i=l;i<=R[p];++i){
			res+=a[i];
		} res+=(R[p]-l+1)*1ll*add[p];
		for(register int i=L[q];i<=r;++i){
			res+=a[i];
		} res+=(r-L[q]+1)*1ll*add[q];
		for(register int i=p+1;i<=q-1;++i){
			res+=sum[i]+(R[i]-L[i]+1)*1ll*add[i]; 
		}
	} return res;
}

int main(){
	scanf("%d%d",&n,&q);t=sqrt(n);
	for(register int i=1;i<=n;++i){
		scanf("%lld",&a[i]);
	}
	for(register int i=1;i<=t;++i){
		L[i]=(i-1)*t-1,R[i]=i*t;
	} if(R[t]<n) ++t,L[t]=R[t-1]+1,R[t]=n;
	for(register int i=1;i<=t;++i){
		for(register int j=L[i];j<=R[i];++j){
			sum[i]+=a[j],belong[j]=i;
		} add[i]=0;
	}
	for(register int i=1;i<=q;++i){
		int op;
		scanf("%d",&op);
		if(op==1){
			int l,r,k;
			scanf("%d%d%d",&l,&r,&k);
			change(l,r,k);
		}
		else{
			int l,r;
			scanf("%d%d",&l,&r);
			printf("%lld\n",query(l,r));
		}
	} return 0;
}
2021/12/11 15:36
加载中...