wa求解,只过了第一个数据和样例
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+6;
ll nn,mm,a[N];
ll tree[N<<2],add[N<<2];
void lazy(ll rt,ll v,ll n)
{
add[rt]+=v;tree[rt]+=(v*n);
}
void down(ll rt,ll l,ll r)
{
if(add[rt])
{
lazy(rt<<1,add[rt],l);
lazy(rt<<1|1,add[rt],r);
add[rt]=0;
}
}
void build(ll rt,ll l,ll r)
{
if(l==r)
{
tree[rt]=a[l];return;
}
ll m=l+r>>1;
build(rt<<1,l,m);build(rt<<1|1,m+1,r);
tree[rt]=tree[rt<<1]+tree[rt<<1|1];//up(rt)
add[rt]=0;//建树
}
ll query(ll rt,ll l,ll r,ll x,ll y)
{
if(l>y||r<x) return 0;
if(l>=x&&r<=y) return tree[rt];
ll ans=0;
ll m=l+r>>1;
down(rt,m-l+1,r-m);
if(x<=m) ans+=query(rt<<1,l,m,x,y);
if(y>m) ans+=query(rt<<1|1,m+1,r,x,y);
return ans;
}
void change(ll rt,ll l,ll r,ll x,ll y,ll v)
{
if(l>=x&r<=y) lazy(rt,v,r-l+1);
else
{
int m=l+r>>1;
down(rt,m-1+1,r-m);
if(x<=m) change(rt<<1,l,m,x,y,v);
if(y>m) change(rt<<1|1,m+1,r,x,y,v);
tree[rt]=tree[rt<<1]+tree[rt<<1|1];
}
}
int main()
{
cin>>nn>>mm;
for(int i=1;i<=nn;++i) cin>>a[i];
build(1,1,nn);
while(mm--)
{
char ch;ll x,y,k;cin>>ch;
if(ch=='1')
{
cin>>x>>y>>k;
change(1,1,nn,x,y,k);
}
else
{
cin>>x>>y;
cout<<query(1,1,nn,x,y)<<endl;
}
}
return 0;
}