本JR调不出来,求助各位大佬。
#include<bits/stdc++.h>
#define rg register int
using namespace std;
const int MAXN=100000;
int tree[4*MAXN+3],n,m,a[MAXN],tag[4*MAXN+5];
void build(int l,int r,int now)
{
if(l==r)
{
tree[now]=a[l];
return ;
}
int mid=(l+r)/2;
build(l,mid,now*2);
build(mid+1,r,now*2+1);
tree[now]=tree[now*2]+tree[now*2+1];
}
void pushdown(int now)
{
if(tag[now])
{
tag[now*2]+=tag[now];
tag[now*2+1]+=tag[now];
tree[now*2]+=tag[now];
tree[now*2+1]+=tag[now];
tag[now]=0;
}
}
void change(int ql,int qr,int l,int r,int k,int now)
{
if(ql<=l&&r<=qr)
{
tree[now]+=(r-l+1)*k;
tag[now]+=k;
return ;
}
pushdown(now);
int mid=(l+r)/2;
if(ql<=mid) change(ql,qr,l,mid,k,now*2);
if(mid<qr) change(ql,qr,mid+1,r,k,now*2+1);
tree[now]=tree[now*2]+tree[now*2+1];
}
int qry(int ql,int qr,int l,int r,int now)
{
if(ql<=l&&r<=qr)
return tree[now];
pushdown(now);
int mid=(l+r)/2,XCNT=0;
if(ql<=mid) XCNT+=qry(ql,qr,l,mid,now*2);
if(mid<r) XCNT+=qry(ql,qr,mid+1,r,now*2+1);
return XCNT;
}
int main()
{
int pd,nl,nr,k;
scanf("%d%d",&n,&m);
for(rg i=1;i<=n;++i) scanf("%d",&a[i]);
build(1,n,1);
for(rg i=1;i<=m;++i)
{
scanf("%d",&pd);
if(pd==1)
{
scanf("%d%d%d",&nl,&nr,&k);
change(nl,nr,1,n,k,1);
}
else
{
scanf("%d%d",&nl,&nr);
printf("%d",qry(nl,nr,1,n,1));
}
}
}