求助!
#include<cstdio>
using namespace std;
typedef long long ll;
const int MAXN=100010;
ll n,m,ans,tot=1,a[MAXN];
struct node
{
ll ls,rs,sum,tag;
};
node tree[MAXN*2];
void push_up(ll u)
{
tree[u].sum=tree[tree[u].ls].sum+tree[tree[u].rs].sum;
}
void push_down(ll u,ll l,ll r)
{
ll mid=(l+r)>>1;
tree[tree[u].ls].sum+=(mid-l+1)*tree[u].tag;
tree[tree[u].ls].tag+=tree[u].tag;
tree[tree[u].rs].sum+=(r-mid)*tree[u].tag;
tree[tree[u].rs].tag+=tree[u].tag;
tree[u].tag=0;
}
void update(ll u,ll l,ll r,ll ln,ll rn,ll k)
{
if(l==ln&&r==rn)
{
tree[u].sum+=(r-l+1)*k;
tree[u].tag+=k;
return;
}
push_down(u,l,r);
ll mid=(l+r)>>1;
if(rn<=mid) update(tree[u].ls,l,mid,ln,rn,k);
else if(ln>mid) update(tree[u].rs,mid+1,r,ln,rn,k);
else
{
update(tree[u].ls,l,mid,ln,mid,k);
update(tree[u].rs,mid+1,r,mid+1,rn,k);
}
push_up(u);
}
void build(ll u,ll l,ll r)
{
if(l==r)
{
tree[u].sum+=a[l];
return;
}
ll mid=(l+r)>>1;
tree[u].ls=++tot;
build(tree[u].ls,l,mid);
tree[u].rs=++tot;
build(tree[u].rs,mid+1,r);
push_up(u);
}
void query(ll u,ll l,ll r,ll ln,ll rn)
{
if(l==ln&&r==rn)
{
ans+=tree[u].sum;
return;
}
ll mid=(l+r)>>1;
if(rn<=mid) query(tree[u].ls,l,mid,ln,rn);
else if(ln>mid) query(tree[u].rs,mid+1,r,ln,rn);
else
{
query(tree[u].ls,l,mid,ln,mid);
query(tree[u].rs,mid+1,r,mid+1,rn);
}
}
int main()
{
scanf("%lld%lld",&n,&m);
for(register ll i=1;i<=n;i++) scanf("%lld",&a[i]);
build(1,1,n);
while(m--)
{
ll opt,x,y;
scanf("%lld%lld%lld",&opt,&x,&y);
if(opt==1)
{
ll k;
scanf("%lld",&k);
update(1,1,n,x,y,k);
}
else
{
ans=0;
query(1,1,n,x,y);
printf("%lld\n",ans);
ans=0;
}
}
}