各个地方都对着看了,读入也对着看了,但还是输出错误结果
#include<bits/stdc++.h>
using namespace std;
int n,m;
unsigned long long a[100007];
struct SegementTree{
int l,r;
unsigned long long sum;
int flag;
}t[400007];
void pushup(int id){
t[id].sum=t[id<<1].sum+t[id<<1|1].sum;
return;
}
void pushdown(int id){
if(t[id].flag){
t[id<<1].sum+=t[id].flag*(t[id<<1].r-t[id<<1].l+1);
t[id<<1|1].sum+=t[id].flag*(t[id<<1|1].r-t[id<<1|1].l+1);
t[id<<1].flag+=t[id].flag;
t[id<<1|1].flag+=t[id].flag;
t[id].flag=0;
}
return;
}
void build(int id,int l,int r){
t[id].l=l;t[id].r=r;
if(l==r){
t[id].sum=a[l];
return;
}
int mid=(l+r)>>1;
build(id<<1,l,mid);
build(id<<1|1,mid+1,r);
pushup(id);
return;
}
void update(int id,int l,int r,int k){
if(l<=t[id].l&&t[id].r<=r){
t[id].sum+=k*(t[id].r-t[id].l+1);
t[id].flag+=k;
return;
}
pushdown(id);
int mid=(t[id].l+t[id].r)>>1;
if(l<=mid)update(id<<1,l,r,k);
if(r>mid)update(id<<1|1,l,r,k);
pushup(id);
return;
}
unsigned long long query(int id,int l,int r){
if(l<=t[id].l&&t[id].r<=r)return t[id].sum;
pushdown(id);
int mid=(t[id].l+t[id].r)>>1;
if(r<=mid)return query(id<<1,l,r);
else if(l>mid)return query(id<<1|1,l,r);
else return query(id<<1,l,r)+query(id<<1,l,r);
}
int Read(){
char x=getchar();int res=0,flag=1;
while(x<'0'||x>'9'){
if(x=='-')flag=-1;
x=getchar();
}
while(x>='0'&&x<='9'){
res=res*10+x-'0';
x=getchar();
}
return flag*res;
}
int main(){
n=Read();m=Read();
for(int i=1;i<=n;++i)
a[i]=Read();
build(1,1,n);
for(int i=1;i<=m;++i){
char ch=getchar();
while(ch!='1'&&ch!='2')ch=getchar();
if(ch=='1'){
int x,y,k;x=Read();y=Read();k=Read();
update(1,x,y,k);
}
else{
int x,y;x=Read();y=Read();
printf("%lld\n",query(1,x,y));
}
}
return 0;
}