求各位神犇纠错,到底哪里错了啊?调了好久没查出来/kk
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ls i<<1
#define rs i<<1|1
const int MAXN=100005;
int n,m;
int A[MAXN];
struct node{
int l,r,w;
int tg;
}tree[MAXN<<2];
void build(int l,int r,int i){
tree[i].l=l,tree[i].r=r;
if(l==r){
tree[i].w=A[l];
return ;
}
int mid=l+r>>1;
build(l,mid,ls);
build(mid+1,r,rs);
tree[i].w=tree[ls].w+tree[rs].w;
}
void push_down(int i){
if(tree[i].tg){
tree[ls].w+=tree[i].tg*(tree[ls].r-tree[ls].l+1);
tree[rs].w+=tree[i].tg*(tree[rs].r-tree[rs].r+1);
tree[ls].tg+=tree[i].tg;
tree[rs].tg+=tree[i].tg;
tree[i].tg=0;
}
}
void update(int l,int r,int k,int i){
if(l<=tree[i].l&&r>=tree[i].r){
tree[i].w+=k*(tree[i].r-tree[i].l+1);
tree[i].tg+=k;
return;
}
push_down(i);
int mid=tree[i].l+tree[i].r>>1;
if(l<=mid)update(l,r,k,ls);
if(r>mid)update(l,r,k,rs);
tree[i].w=tree[ls].w+tree[rs].w;
}
int query(int l,int r,int i){
if(l<=tree[i].l&&r>=tree[i].r)return tree[i].w;
push_down(i);
int mid=tree[i].l+tree[i].r>>1;
int res=0;
if(l<=mid)res+=query(l,r,ls);
if(r>mid)res+=query(l,r,rs);
return res;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>A[i];
build(1,n,1);
while(m--){
int op;
cin>>op;
if(op==1){
int x,y,k;
cin>>x>>y>>k;
update(x,y,k,1);
}
else{
int x,y;
cin>>x>>y;
cout<<query(x,y,1)<<endl;
}
}
return 0;
}