全部RE,求教
查看原帖
全部RE,求教
538821
m1kusama楼主2022/7/9 17:23
#include<bits/stdc++.h>
#define maxn 100005
using namespace std;
long long a[maxn+2],mid,ans;

struct tree{
	long long r,l,pre,tag;
}t[maxn*4+2];


void build(int l,int r,int p){
	t[p].l=l;
	t[p].r=r;
	if(l==r){
		t[p].pre=a[l];
		return;
	}
	mid=(l+r)/2;
	build(l,mid,2*p);
	build(mid+1,r,2*p+1);
	t[p].pre=t[p*2].pre+t[p*2+1].pre;
}


void spread(int p){
	if(t[p].tag){
		t[p*2].pre+=t[p].tag*(t[p*2].r-t[p*2].l+1);
		t[p*2+1].pre+=t[p].tag*(t[p*2+1].r-t[p*2+1].l+1);	
		t[p*2].tag=t[p].tag;
		t[p*2+1].tag=t[p].tag;
		t[p].tag=0; 
	}
}

void gai(int x,int y,int p,int shu){
	if(x<=t[p].l&&y>=t[p].r){
		t[p].tag+=shu;
		t[p].pre+=shu*(t[p].r-t[p].l+1);
	}
	spread(p);
	long long mid=(t[p].l+t[p].r)/2;
	if(y>mid) gai(x,y,p*2,shu);
	if(x<=mid) gai(x,y,p*2+1,shu);
	t[p].pre=t[p*2].pre+t[p*2+1].pre;
}

long long cha(int p,int x,int y){
	if(x<=t[p].l&&y>=t[p].r){
		return t[p].pre;
	}
	spread(p);
	long long mid=(t[p].l+t[p].r)/2;
	if(x<=mid) ans+=cha(p*2+1,x,y);
	if(y>mid) ans+=cha(p*2,x,y);
	t[p].pre=t[p*2].pre+t[p*2+1].pre;	
	return ans;
}
int main(){
	int n,m,biao,x,y,k;
	cin>>n>>m;
	build(1,n,1);
	for(int i=0;i<n;i++){
		cin>>a[i+1];
	}
	for(int i=0;i<m;i++){
		cin>>biao;
		if(biao==1){
			cin>>x>>y>>k;
			gai(x,y,1,k);
		}else{
			cin>>x>>y;
			cout<<cha(1,x,y)<<endl;
		}
	}
	return 0;
}
2022/7/9 17:23
加载中...