求助RE(玄学?)
#include<bits/stdc++.h>
using namespace std;
long long tree[1005000];
int tl[1005000],tr[1005000],tmid[1005000];
int a[500070];
int n,m;
inline int read()
{
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
}
void make_tree(int x,int l,int r){
tl[x]=l;
tr[x]=r;
if(l==r){
tree[x]=a[l];
}
else{
int mid=(l+r)/2;
tmid[x]=mid;
make_tree(x*2,l,mid);
make_tree(x*2+1,mid+1,r);
tree[x]=tree[x*2]+tree[x*2+1];
}
}
void add(int x,int k,long long n){
tree[x]+=n;
if(tl[x]<tr[x]){
if(k<=tmid[x])
add(x*2,k,n);
else add(x*2+1,k,n);
}
}
long long find(int x,int l,int r){
if(tl[x]==l && tr[x]==r)
return tree[x];
if(r<=tmid[x])
return find(x*2,l,r);
else if(l>=tmid[x])
return find(x*2+1,l,r);
return find(x*2,l,tmid[x])+find(x*2+1,tmid[x]+1,r);
}
int main(){
n=read();
m=read();
for(int i=1;i<=n;i++)
a[i]=read();
make_tree(1,1,n);
for(int i=1;i<=m;i++){
int opt;
opt=read();
if(opt==1){
int n;
long long now;
n=read();
now=read();
add(1,n,now);
}
if(opt==2){
int a,b;
a=read();
b=read();
long long ans=find(1,a,b);
printf("%lld\n",ans);
}
}
return 0;
}