结构体是个好东西。。。
看着逼格很高
#include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<algorithm> #define l(x) (x<<1) #define r(x) ((x<<1)|1) #define ll long long using namespace std; struct Treenode{int l,r;ll tag,val;}; struct Segtree { Treenode tr[5*100010]; void pushup(int id){tr[id].val=tr[l(id)].val+tr[r(id)].val;} void pushdown(int id) { tr[l(id)].val+=tr[id].tag*(tr[l(id)].r-tr[l(id)].l+1); tr[r(id)].val+=tr[id].tag*(tr[r(id)].r-tr[r(id)].l+1); tr[l(id)].tag+=tr[id].tag;tr[r(id)].tag+=tr[id].tag; tr[id].tag=0; } void build(int id,int L,int R) { tr[id].l=L,tr[id].r=R; tr[id].tag=0; if(L==R) { scanf("%lld",&tr[id].val); return; } int mid=(L+R)>>1; build(l(id),L,mid); build(r(id),mid+1,R); pushup(id); } void update(int id,int L,int R,ll k) { if(tr[id].l>=L && tr[id].r<=R) { tr[id].val+=k*(tr[id].r-tr[id].l+1); tr[id].tag+=k; return; } if(tr[id].tag)pushdown(id); int mid=(tr[id].l+tr[id].r)>>1; if(L<=mid)update(l(id),L,R,k); if(R>mid) update(r(id),L,R,k); pushup(id); } ll query(int id,int L,int R) { if(tr[id].l>=L && tr[id].r<=R)return tr[id].val; if(tr[id].tag)pushdown(id); int mid=(tr[id].l+tr[id].r)>>1; ll ans=0; if(L<=mid)ans+=query(l(id),L,R); if(R>mid)ans+=query(r(id),L,R); return ans; } }Seg; int main() { int n,m; scanf("%d%d",&n,&m); Seg.build(1,1,n); while(m--) { int opt,x,y,k; scanf("%d",&opt); if(opt==1) { scanf("%d%d%d",&x,&y,&k); Seg.update(1,x,y,k); } if(opt==2) { scanf("%d%d",&x,&y); printf("%lld ",Seg.query(1,x,y)); } } }