前七个点AC,后三个点WA掉了:(
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
long long v[N];
int n,cnt=1,m;
struct Node{
int l,r;
long long add,val;
}a[N*4];
void build(int k,int l,int r){
if(l==r){
a[k].val=v[l];
return;
}
int mid=(l+r)>>1;
a[k].l=++cnt;
build(a[k].l,l,mid);
a[k].r=++cnt;
build(a[k].r,mid+1,r);
a[k].val=a[a[k].l].val+a[a[k].r].val;
return;
}
void addtag(int k,int l,int r,int val){
a[k].val+=val*(r-l+1);
a[k].add+=val;
return;
}
void add(int k,int l,int r,int ql,int qr,int val){
if(ql==l&&qr==r){
addtag(k,l,r,val);
return;
}
int mid=(l+r)>>1;
addtag(a[k].l,l,mid,a[k].add);
addtag(a[k].r,mid+1,r,a[k].add);
a[k].add=0;
if(qr<=mid)
add(a[k].l,l,mid,ql,qr,val);
else if(ql>mid)
add(a[k].r,mid+1,r,ql,qr,val);
else{
add(a[k].l,l,mid,ql,mid,val);
add(a[k].r,mid+1,r,mid+1,qr,val);
}
a[k].val=a[a[k].l].val+a[a[k].r].val;
return;
}
int Query(int k,int l,int r,int ql,int qr){
if(l==ql&&r==qr)
return a[k].val;
int mid=(l+r)>>1;
addtag(a[k].l,l,mid,a[k].add);
addtag(a[k].r,mid+1,r,a[k].add);
a[k].add=0;
int ret=0;
if(qr<=mid)
ret=Query(a[k].l,l,mid,ql,qr);
else if(ql>mid)
ret=Query(a[k].r,mid+1,r,ql,qr);
else
ret=Query(a[k].l,l,mid,ql,mid)+Query(a[k].r,mid+1,r,mid+1,qr);
a[k].val=a[a[k].l].val+a[a[k].r].val;
return ret;
}
int main(){
int kind,x,y,k,ans,p;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&v[i]);
build(1,1,n);
for(int i=1;i<=m;i++){
scanf("%d",&kind);
if(kind==1){
scanf("%d%d%d",&x,&y,&k);
add(1,1,n,x,y,k);
}
if(kind==2){
scanf("%d%d",&x,&y);
ans=Query(1,1,n,x,y);
printf("%d\n",ans);
}
}
return 0;
}