RT 代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N=1e6;
int lazy[N],n,m,sum[N];
void pushup(int rt)
{
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void build(int l,int r,int rt)
{
if(l==r)
{
scanf("%d",&sum[rt]);
return;
}
int mid=l+r>>1;
build(l,mid,rt<<1);
build(mid+1,r,rt<<1|1);
pushup(rt);
}
void pushdown(int rt,int ln,int rn)
{
if(lazy[rt])
{
lazy[rt<<1]+=lazy[rt];
lazy[rt<<1|1]+=lazy[rt];
sum[rt<<1]+=lazy[rt]*ln;
sum[rt<<1|1]+=lazy[rt]*rn;
lazy[rt]=0;
}
}
void modify(int l,int r,int rt,int nowl,int nowr,int c)
{
if(nowl<=l && nowr>=r)
{
lazy[rt]+=c;
sum[rt]+=(r-l+1)*c;
return;
}
int mid=l+r>>1;
pushdown(rt,mid-l+1,r-mid);
if(nowl<=mid) modify(l,mid,rt<<1,nowl,nowr,c);
if(nowr>mid) modify(mid+1,r,rt<<1|1,nowl,nowr,c);
pushup(rt);
}
int query(int l,int r,int rt,int nowl,int nowr)
{
if(nowl<=l && nowr>=r) return sum[rt];
int mid=l+r>>1;
int ans=0;
pushdown(rt,mid-l+1,r-mid);
if(nowl<=mid) ans+=query(l,mid,rt<<1,nowl,nowr);
if(nowr>mid) ans+=query(mid+1,r,rt<<1|1,nowl,nowr);
return ans;
}
int main()
{
cin>>n>>m;
build(1,n,1);
for(int i=1;i<=m;i++)
{
int op,x,y,z;
scanf("%d",&op);
if(op==1)
{
scanf("%d%d%d",&x,&y,&z);
modify(1,n,1,x,y,z);
}
if(op==2)
{
scanf("%d",&z);
modify(1,n,1,1,1,z);
}
if(op==3)
{
scanf("%d",&z);
modify(1,n,1,1,1,-z);
}
if(op==4)
{
scanf("%d%d",&x,&y);
printf("%d\n",query(1,n,1,x,y));
}
if(op==5)
{
printf("%d\n",query(1,n,1,1,1));
}
}
return 0;
}