rt,求助
#include<iostream>
using namespace std;
long long a[100010];
struct node
{
long long l,r;
long long val,lazy;
node():val(0),lazy(0){}
}tree[400010];
void build(long long now,long long l,long long r)
{
tree[now].l=l,tree[now].r=r;
if(l==r)
{
tree[now].val=a[l];
return;
}
long long mid=(l+r)/2;
long long lson=now*2,rson=now*2+1;
build(lson,l,mid);
build(rson,mid+1,r);
tree[now].val=tree[lson].val+tree[rson].val;
}
void add(long long now,long long l,long long r,long long val)
{
if(tree[now].l==tree[now].r)
{
tree[now].val+=val;
return;
}
if(l==tree[now].l&&r==tree[now].r)
{
tree[now].val+=(r-l+1)*val;
tree[now].lazy+=val;
return;
}
long long mid=(tree[now].l+tree[now].r)/2;
long long lson=now*2,rson=now*2+1;
if(r<=mid)
add(lson,l,r,val);
else if(l>mid)
add(rson,l,r,val);
else
add(lson,l,mid,val),add(rson,mid+1,r,val);
tree[now].val+=(r-l+1)*val;
}
long long sum(long long now,long long l,long long r)
{
if(tree[now].l==tree[now].r)
{
tree[now].lazy=0;
return tree[now].val;
}
if(l==tree[now].l&&r==tree[now].r)
return tree[now].val;
long long mid=(tree[now].l+tree[now].r)/2,res=0;
long long lson=now*2,rson=now*2+1;
tree[lson].lazy+=tree[now].lazy,tree[rson].lazy+=tree[now].lazy;
tree[lson].val+=(mid-l+1)*tree[now].lazy,tree[rson].val+=(r-mid)*tree[now].lazy;
tree[now].lazy=0;
if(r<=mid)
res=sum(lson,l,r);
else if(l>mid)
res=sum(rson,l,r);
else
res=sum(lson,l,mid)+sum(rson,mid+1,r);
return res;
}
int main()
{
ios::sync_with_stdio(false);
long long n,m;
cin>>n>>m;
for(long long i=1;i<=n;i++)
cin>>a[i];
build(1,1,n);
while(m--)
{
long long op,x,y,k;
cin>>op;
if(op==1)
{
cin>>x>>y>>k;
add(1,x,y,k);
}
else
{
cin>>x>>y;
cout<<sum(1,x,y)<<endl;
}
}
return 0;
}