36分求调
查看原帖
36分求调
1392539
ymdheliyang楼主2024/7/21 18:00
#include<bits/stdc++.h>
using namespace std;
long long n,f,a[200005],l[500],r[500],belong[200005],sum[500],sum2[500];
void kuai(){
	long long len=sqrt(n),tot=(n-1)/len+1;
	for(long long i=1;i<=tot;i++){
		l[i]+=r[i-1]+1,r[i]=i*len;
	}
	r[tot]=n;
	for(long long i=1;i<=tot;i++){
		for(long long j=l[i];j<=r[i];j++) sum[i]+=a[j],belong[j]=i;
	}
}
long long getsum(long long l1,long long r1){
	long long p=belong[l1],q=belong[r1],ans=0;
	if(p==q){
		for(long long i=l1;i<=r1;i++) ans+=a[i];
		return ans;
	}
	for(long long i=l1;i<=r[p];i++) ans+=(a[i]+sum2[p]);
	for(long long i=p+1;i<q;i++){
		ans+=sum[i];
		ans+=(sum2[i]*(r[i]-l[i]+1));
	}
	for(long long i=l[q];i<=r1;i++) ans+=(a[i]+sum2[q]);
	return ans;
}
void add(long long l1,long long r1,long long k){
	long long p=belong[l1],q=belong[r1];
	if(p==q){
		for(long long i=l1;i<=r1;i++){
			a[i]+=k;
			sum[p]+=k;
		}
		return;
	}
	for(long long i=l1;i<=r[p];i++){
		a[i]+=k;
		sum[p]+=k;
	}
	for(long long i=p+1;i<q;i++){
		sum2[i]+=k;
	}
	for(long long i=l[q];i<=r1;i++){
		a[i]+=k;
		sum[q]+=k;
	}
}
int main() {
	cin>>n>>f;
	for(long long i=1;i<=n;i++){
		cin>>a[i];
	}
	kuai();
	while(f--){
		long long c,l,r,k;
		cin>>c;
		if(c==1){
			cin>>l>>r>>k;
			add(l,r,k);
		}
		if(c==2){
			cin>>k;
			a[1]+=k;
			sum[belong[1]]+=k;
		}
		if(c==3){
			cin>>k;
			a[1]-=k;
			sum[belong[1]]-=k;
		}
		if(c==4){
			cin>>l>>r;
			cout<<getsum(l,r)<<endl;
		}
		if(c==5){
			cout<<a[1]<<endl;
		}
	}
	return 0;
}
2024/7/21 18:00
加载中...