rt,救救孩子吧,调的心态炸了
#include<bits/stdc++.h>
using namespace std;
int n;
struct Tree{
long long l,r,sum,lazytag;
}tree[200001<<2];
int a[200005<<2];
inline int leftson(int p){return p<<1;}
inline int rightson(int p){return (p<<1)|1;}
void push_down(int i){
if(tree[i].lazytag!=0){
tree[leftson(i)].lazytag+=tree[i].lazytag;
tree[rightson(i)].lazytag+=tree[i].lazytag;
tree[leftson(i)].sum+=tree[i].lazytag*(tree[leftson(i)].r-tree[leftson(i)].l+1);
tree[rightson(i)].sum+=tree[i].lazytag*(tree[rightson(i)].r-tree[rightson(i)].l+1);
tree[i].lazytag=0;
}
return;
}
void push_up(int i){
tree[i].sum=tree[leftson(i)].sum+tree[rightson(i)].sum;
}
inline int search(int i,int l,int r){
if(tree[i].l>=l&&tree[i].r<=r) return tree[i].sum;
if(tree[i].r<l||tree[i].l>r) return 0;
push_down(i);
int s=0;
push_up(i);
s+=search(leftson(i),l,r);
s+=search(rightson(i),l,r);
return s;
}
void add(int i,int l,int r,int k){
if(tree[i].l>r||tree[i].r<l) return;
if(tree[i].r<=r&&tree[i].l>=l){
tree[i].sum+=k*(tree[i].r-tree[i].l+1);
tree[i].lazytag+=k;
return ;
}
push_down(i);
add(leftson(i),l,r,k);
add(rightson(i),l,r,k);
push_up(i);
return ;
}
inline void build(int i,int l,int r){
tree[i].l=l,tree[i].r=r;
if(l==r){
tree[i].sum=a[l];
return ;
}
int mid=l+r>>1;
build(leftson(i),l,mid);
build(rightson(i),mid+1,r);
push_up(i);
}
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
build(1,1,n);
for(int i=1;i<=m;i++){
int command;
scanf("%d",&command);
if(command==1){
int x,y,k;
scanf("%d%d%d",&x,&y,&k);
add(1,x,y,k);
}
if(command==2){
int x,y;
scanf("%d%d",&x,&y);
cout<<search(1,x,y)<<endl;
}
}
}