萌新求调
查看原帖
萌新求调
696085
ZZ_nyn楼主2024/7/30 21:46
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e5+10;
ll n,m,tree[N<<2],tag[N<<2],a[N],x,y,k;
ll ls(ll p) {return p<<1;}
ll rs(ll p) {return p<<1|1;}
void push_up(ll p){
	tree[p]=tree[ls(p)]+tree[rs(p)];
}
void built(ll p,ll pl,ll pr){
	tag[p]=0;
	if(pl==pr){
		tree[p]=a[pl];
		return;
	}
	ll mid=(pl+pr)>>1;
	built(ls(p),pl,mid);
	built(ls(p),mid+1,pr);
	push_up(p);
}
void addtag(ll p,ll pl,ll pr,ll d){
	tag[p]+=d;
	tree[p]+=d*(pr-pl+1);
}
void push_down(ll p,ll pl,ll pr){
	if(tag[p]){
		ll mid=(pl+pr)>>1;
		addtag(ls(p),pl,mid,tag[p]);
		addtag(rs(p),mid+1,pr,tag[p]);
		tag[p]=0;
	}
}
void update(ll p,ll L,ll R,ll pl,ll pr,ll d){
	if(L<=pl&&R>=pr){
		addtag(p,pl,pr,d);
		return;
	}
	ll mid=(pl+pr)>>1;
	push_down(p,pl,pr);
	if(L<=mid)update(ls(p),L,R,pl,mid,d);
	if(R>mid)update(rs(p),L,R,mid+1,pr,d);
	push_up(p);
}
ll query(ll p,ll L,ll R,ll pl,ll pr){
	if(L<=pl&&R>=pr){
		return tree[p];
	}
	push_down(p,pl,pr);
	ll mid=(pl+pr)>>1;
	ll res=0;
	if(L<=mid)res+=query(ls(p),L,R,pl,mid);
	if(R>mid)res+=query(rs(p),L,R,mid+1,pr);
	return res;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	built(1,1,n);
	for(int i=1;i<=m;i++){
		int o;
		cin>>o;
		if(o==1)
		{
			cin>>x>>y>>k;
			update(1,x,y,1,n,k);
		}else{
			cin>>x>>y;
			cout<<query(1,x,y,1,n)<<endl;
		}
	}
	return 0;
}
2024/7/30 21:46
加载中...