rt,哪里挂了
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 1e5+5;
int n,m;
ll res;
int st[N];
struct node{
int l,r,num,tag;
}a[4*N];
int ls(int x){return 2*x;}
int rs(int x){return 2*x+1;}
void push_up(int x){
a[x].num = a[ls(x)].num+a[rs(x)].num;
}
void push_down(int x){
if(a[x].tag){
a[ls(x)].num+=a[x].tag*(a[ls(x)].r-a[ls(x)].l+1);
a[rs(x)].num+=a[x].tag*(a[rs(x)].r-a[rs(x)].l+1);
a[ls(x)].tag+=a[x].tag;
a[rs(x)].tag+=a[x].tag;
a[x].tag = 0;
}
}
void update(int x,int l,int r,int k){
if(l<=a[x].l&&a[x].r<=r){
a[x].tag+=k;
a[x].num+=(a[x].r-a[x].l+1)*k;
return;
}
push_down(x);
int mid = (a[x].l+a[x].r)>>1;
if(l<=mid)update(ls(x),l,r,k);
if(r>mid)update(rs(x),l,r,k);
push_up(x);
}
void build(int x,int l ,int r){
a[x].l = l,a[x].r = r;
if(l==r){
a[x].num = st[l];
return;
}
int mid = (l+r)>>1;
build(ls(x),l,mid);
build(rs(x),mid+1,r);
push_up(x);
}
ll query(int x,int l,int r){
if(l<=a[x].l&&a[x].r<=r){
return a[x].num;
}
int mid = (l+r)>>1;
if(l<=mid)res+=query(ls(x),l,r);
if(mid<r)res+=query(rs(x),l,r);
return res;
}
void solve(){
int p,x,y;
cin>>p>>x>>y;
if(p==1){
int k;
cin>>k;
update(1,x,y,k);
}
if(p==2){
res = 0;
cout<<query(1,x,y)<<endl;
}
}
int main(){
cin>>n>>m;
for(int i = 1;i<=n;i++)cin>>st[i];
build(1,1,n);
while(m--)solve();
return 0;
}