线段树全0 求调 玄关
查看原帖
线段树全0 求调 玄关
1165230
I_AK_IOI_6645楼主2024/2/23 16:41
#include<iostream>
#define ll long long
ll n,m,a[100005];
ll ans[100005],tag[1000005];
ll b;
ll x,y,z,e,f;
using namespace std;
ll ls(ll p){
	return p<<1;
}
ll rs(ll p){
	return p<<1|1;
}
void push_up(ll p){
	ans[p] = ans[ls(p)]+ans[rs(p)];
}
void f1(ll p,ll l,ll r,ll k){
	tag[p] += k;
	ans[p] += (r-l+1)*k;
}
void build(int l,int r,int p){
	tag[p] = 0;
	if(l == r){
		ans[p] = a[l];
		return ;
	}
	ll mid = l+r>>1;
	build(,mid,ls(p));
	build(mid+1,r,rs(p));
	push_up(p);
}
void push_down(ll l,ll r,ll p){
	ll mid = l+r>>1;
	f1(ls(p),l,mid,tag[p]);
	f1(rs(p),mid+1,r,tag[p]);
	tag[p] = 0;
}
void update(ll nl,ll nr,ll l,ll r,ll p,ll k){
	if(nl <= l && r <= nr){
		ans[p] += k*(r-l+1);
		tag[p] += k;
		return ;
	}
	push_down(l,r,p);
	ll 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);
}
ll query(ll qx,ll qy,ll r,ll l,ll p){
	ll res = 0;
	if(qx <= l && r <= qy){
		return ans[p];
	}
	ll mid = l+r>>1;
	push_down(l,r,p);
	if(qx <= mid) res += query(qx,qy,l,mid,ls(p));
	if(qy > mid) res += query(qx,qy,mid+1,r,rs(p));
	return res;
}
int main(){
	cin>>n>>m;
	for(int i = 1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	build(1,1,n);
	while(m--){
		cin>>b;
		if(b == 1){
			scanf("%lld%lld%lld",&x,&y,&z);
			update(x,y,1,n,1,z);
		}
		else{
			scanf("%lld%lld",&e,&f);
			printf("%lld\n",query(e,f,1,n,1));
		}
	}
}
2024/2/23 16:41
加载中...