求调10ptsWAWAWA
查看原帖
求调10ptsWAWAWA
746930
NO_OI_NO_LIFE楼主2023/10/22 13:19
#include <bits/stdc++.h>
#define int long long
#define ls p<<1
#define rs p<<1|1
using namespace std;

int pos,n,m,x,y,k;

struct node{
	int p,l,r,v,a;
}t[1000005<<2];

void up(int p){
	t[p].v=t[ls].v+t[rs].v;
}

void down(int p){
	if(!t[p].a) return;
	
	t[ls].a+=t[p].a;
	t[rs].a+=t[p].a;
	
	t[ls].v+=t[p].a*(t[ls].r-t[ls].l+1);
	t[rs].v+=t[p].a*(t[rs].r-t[ls].l+1);
	
	t[p].a=0;
}

void build(int p,int l,int r){
	t[p].l=l;t[p].r=r;
	if(l==r){
		cin>>t[p].v;
		return;
	}
	int mid=l+(r-l>>1);
	build(ls,l,mid);
	build(rs,mid+1,r);
	up(p);
} 

void mdf(int p,int l,int r,int k){
	if(l<=t[p].l&&t[p].r<=r){
		t[p].a+=k;
		t[p].v+=k*(t[p].r-t[p].l+1);
		return;
	}
	down(p);
	int mid=t[p].l+(t[p].r-t[p].l>>1);
	if(l<=mid) mdf(ls,l,r,k);
	if(r>mid)  mdf(rs,l,r,k);
	up(p);
}

int que(int p,int l,int r){
	if(l<=t[p].l&&t[p].r<=r) return t[p].v;
	down(p);
	int res=0;
	int mid=t[p].l+(t[p].r-t[p].l>>1);
	if(l<=mid) res+=que(ls,l,r);
	if(r>mid)  res+=que(rs,l,r);
	return res;
}

signed main(){
	//freopen("uqe.in","r",stdin);
	//freopen("uqe.out","w",stdout);
	cin>>n>>m;
	build(1,1,n);
	while(m--){
		cin>>pos;
		if(pos==1){
			cin>>x>>y>>k;
			mdf(1,x,y,k);
		}
		else{
			cin>>x>>y;
			cout<<que(1,x,y)<<endl;
		}
	}
	return 0;
}
2023/10/22 13:19
加载中...