三个点被tle了
#include <bits/stdc++.h>
using namespace std;
const int N = 1e7+10;
long long n,m,a[N],q,x,y,k;
struct node{
long long val,left,right;
}g[N];
void init(long long l,long long r,int b){
if(l==r){
g[b].val=a[l];
g[b].left=l;
g[b].right=r;
return;
}
long long mid=(l+r)>>1;
init(l,mid,b*2);
init(mid+1,r,b*2+1);
g[b].val=g[b*2].val+g[b*2+1].val;
g[b].left=l;
g[b].right=r;
}
void add(long long l,long long r,long long x,long long y,long long k,int b){
if(l>y || r<x)return;
if(l==r){
g[b].val+=k;
return;
}
long long mid=(l+r)>>1;
add(l,mid,x,y,k,b*2);
add(mid+1,r,x,y,k,b*2+1);
g[b].val=g[b*2].val+g[b*2+1].val;
}
long long pnt(long long l,long long r,long long x,long long y,int b){
if(l>y || r<x || x>y)return 0;
long long ans=0;//1 3 2 3
ans += pnt(g[b*2+1].left,g[b*2+1].right,x,y,b*2+1);
ans += pnt(g[b*2].left,g[b*2].right,x,y,b*2);
if(l==r){
ans += g[b].val;
}
return ans;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
init(1,n,1);
while(m--){
cin>>q>>x>>y;
if(q==1){
cin>>k;
add(1,n,x,y,k,1);
}else{
//question
cout<<pnt(g[1].left,g[1].right,x,y,1)<<endl;
}
}
return 0;
}