用的线段树,只有30分,查不出来哪里错了
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 4 * 2000010;
ll n, m, a[maxn], sum[maxn], addv[maxn];
//ll l, r;
void build(ll o,ll l,ll r){
if(l==r){
sum[o]=a[l];
return;
}
ll lc=2*o,rc=2*o+1;
ll c=l+(r-l)/2;
build(lc,l,c);
build(rc,c+1,r);
sum[o]=sum[lc]+sum[rc];
}
void maintain(ll o,ll l,ll r){
ll lc=2*o,rc=2*o+1;
if(r>l)
sum[o]=sum[lc]+sum[rc];
sum[o]+=addv[o]*(r-l+1);
}
ll ql,qr,v;
void update(ll o,ll l,ll r){
ll lc=2*o,rc=2*o+1;
ll c=l+(r-l)/2;
if(ql<=l&&qr>=r){
addv[o]+=v;
}
else{
if(ql<=c)
update(lc,l,c);
if(qr>c)
update(rc,c+1,r);
}
maintain(o,l,r);
}
ll sumv;
void query(ll o,ll l,ll r,ll add){
ll c=l+(r-l)/2;
ll lc=2*o,rc=2*o+1;
if(ql<=l&&qr>=r)
sumv+=sum[o]+add*(r-l+1);
else{
if(ql<=c)
query(lc,l,c,addv[o]+add);
if(qr>c)
query(rc,c+1,r,addv[o]+add);
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
while(m--){
ll f;
cin>>f>>ql>>qr;
if(f==1){
cin>>v;
update(1,1,n);
}
if(f==2){
sumv=0;
query(1,1,n,0);
cout<<sumv<<endl;
}
}
return 0;
}