WA球助
查看原帖
WA球助
502702
ABookCD楼主2021/10/7 20:06
#include<bits/stdc++.h>
using namespace std;
const long long maxn=200010;
const long long  inf=0x3f3f3f3f; 
long long minv[4*maxn],a[maxn],tag[maxn];
void pushdown(long long id,long long l,long long r)
{
   long long mid=(l+r)>>1;
   tag[id*2]+=tag[id];
   tag[id*2+1]=tag[id];
   minv[id*2]+=tag[id]*(mid-l+1);
   minv[id*2+1]+=tag[id]*(r-mid);
   tag[id]=0;
}
void pushup(long long id){
	minv[id]=minv[2*id]+minv[2*id+1];
	return;
}
void build(long long id,long long l,long long r){
	tag[id]=0;
	if(l==r){
		minv[id]=a[l];
		return;
	}
	long long mid=(l+r)/2;
	build(id*2,l,mid);
	build(id*2+1,mid+1,r); 
	pushup(id);
}
void update(long long ansl,long long ansr,long long id,long long l,long long r,long long x){
	if(ansl<=l&&r<=ansr){
		minv[id]+=x*(r-l+1);
		tag[id]+=x;
		return;
	}
	pushdown(id,l,r);
	long long mid=(l+r)/2;
	if(ansl<=mid) update(ansl,ansr,id*2,l,mid,x);
	if(ansr>mid) update(ansl,ansr,id*2+1,mid+1,r,x);
	pushup(id);
}
int query(long long id,long long l,long long r,long long x,long long y){
	if(l>=x&&r<=y){
		return minv[id];
	}
	long long mid=(l+r)/2;
	long long ans=0;
	pushdown(id,l,r);
	if(x<=mid) ans+=query(id*2,l,mid,x,y);
	if(y>mid) ans+=query(id*2+1,mid+1,r,x,y);
	return ans;
}
int main(){
	long long n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	build(1,1,n);
	while(m--){
		int x;
		cin>>x;
		if(x==1) {
			int x1,y1,z1;
			cin>>x1>>y1>>z1;
			update(x1,y1,1,1,n,z1);
		}
		if(x==2){
			int x2,y2;
			cin>>x2>>y2;
			cout<<query(1,1,n,x2,y2)<<endl;
		}
	}
	return 0;
}
2021/10/7 20:06
加载中...