RE求调
查看原帖
RE求调
838542
Never_Gone楼主2023/11/14 18:01
#include<bits/stdc++.h>
#define int long long 

using namespace std;
const int maxn=1000010;

int a[maxn],tag[maxn<<2],ans[maxn<<2];
int n,m;

int ls(int b){
	return b<<1;
}

int rs(int b){
	return b<<1|1;
}

void push_up(int b){
	ans[b]=ans[ls(b)]+ans[rs(b)];
}

void build(int p,int l,int r){
	//cout<<1<<endl;
	tag[p]=0;
	if(l==r) {ans[p]=a[l]; return;}
	int mid=(l+r)>>1;
	build(ls(p),l,mid);
	build(rs(p),mid+1,r);
	push_up(p);
}

void f(int p,int l,int r,int k){
	tag[p]=tag[p]+k;
	ans[p]=ans[p]+k*(r-l+1);
}

void push_down(int p,int l,int r){
	int mid=(l+r)>>1;
	f(ls(p),l,mid,tag[p]);
	f(rs(p),mid+1,r,tag[p]);
	tag[p]=0;
}

void update(int nl,int nr,int l,int r,int p,int k){
	if(nl<=l && nr>=r) {//到达叶节点 
		ans[p]+=k*(r-l+1);
		tag[p]+=k;
		return;
	}
	
	push_down(p,l,r);//回溯 
	int mid=(l+r)>>1;
	if(nl<=mid) update(nl,nr,l,mid,ls(p),k);
	if(nr>mid) update(nl,nr,mid+1,r,rs(p),k);
	push_up(p);
}

int query(int qx,int qy,int l,int r,int p){
	int cnt;
	if(qx<=l && qy>=r) return ans[p];
	int mid=(l+r)>>1;
	push_down(p,l,r);//回溯
	if(qx<=mid) cnt+=query(qx,qy,l,mid,ls(p));
	if(qy>mid) cnt+=query(qx,qy,mid+1,r,rs(p));
	return cnt; 
}

signed main()
{
	//cin.tie(0),cout.tie(0);
	//ios::sync_with_stdio(false);
	
	cin>>n>>m;	
	for(int i=1;i<=n;i++) cin>>a[i];
	
	build(n,n,1);
	//cout<<2;
	for(int i=1;i<=m;i++){
		int q;
		cin>>q;
		
		if(q==1){
			int b,c,d;
			cin>>b>>c>>d;
			update(b,c,1,n,1,d);
		}
		else{
			int b,c;
			cin>>b>>c;
			int d=query(b,c,1,n,1);
			cout<<d<<"\n";
		}
	}
	
	return 0;
}
2023/11/14 18:01
加载中...