WA求助
#include <bits/stdc++.h>
using namespace std;
long long tree[400005],n,num[100005],lazy[400005],m;
void build(long long root,long long start,long long end)
{
if(start==end)
{
tree[root]=num[start];
return;
}
int mid=(start+end)>>1;
build(root*2,start,mid);
build(root*2+1,mid+1,end);
tree[root]=tree[root*2]+tree[root*2+1];
}
void lazydown(long long root,long long start,long long end)
{
if(!lazy[root] || start==end)
{
return;
}
int mid=(start+end)>>1;
tree[root*2]+=lazy[root]*(mid-start+1);
tree[root*2+1]+=lazy[root]*(end-mid);
lazy[root*2]+=lazy[root];
lazy[root*2+1]+=lazy[root];
lazy[root]=0;
}
int query(long long root,long long start,long long end,long long l,long long r)
{
if(l<=start && r>=end)
{
return tree[root];
}
lazydown(root,start,end);
int mid=(start+end)>>1;
if(r<=mid)
{
return query(root*2,start,mid,l,r);
}else if(l>mid)
{
return query(root*2+1,mid+1,end,l,r);
}else{
return query(root*2+1,mid+1,end,l,r)+query(root*2,start,mid,l,r);
}
}
void update(long long root,long long start,long long end,long long l,long long r,long long k)
{
if(l<=start && r>=end)
{
tree[root]+=k*(start-end+1);
lazy[root]+=k;
return;
}
lazydown(root,start,end);
int mid=(start+end)>>1;
if(r<=mid)
{
update(root*2,start,mid,l,r,k);
}else if(l>mid){
update(root*2+1,mid+1,end,l,r,k);
}else{
update(root*2+1,mid+1,end,l,r,k);
update(root*2,start,mid,l,r,k);
}
tree[root]=tree[root*2]+tree[root*2+1];
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>num[i];
}
build(1,1,n);
for(int i=1;i<=m;i++)
{
int type,x=0,y=0,k=0;
cin>>type;
if(type==1)
{
cin>>x>>y>>k;
update(1,1,n,x,y,k);
}else{
cin>>x>>y;
cout<<query(1,1,n,x,y)<<endl;
}
}
}