而且还没有错误提示
#include <bits/stdc++.h>
using namespace std;
struct node
{
int value=-1;
int left=-1,right=-1;
};
int a[500005];
node tree[2000005];
void build(int id,int left,int right)
{
if(right<left)
return ;
if(right!=left)
{
tree[id].left=left;
tree[id].right=right;
build(id*2,left,(left+right)/2);
build(id*2+1,(left+right)/2+1,right);
tree[id].value=tree[id*2].value+tree[id*2+1].value;
return;
}
else if(left==right)
{
tree[id].left=left;
tree[id].right=right;
tree[id].value=a[left];
return ;
}
return ;
}
int n,m;
int find(int id,int value_id)
{
if(tree[id].left==value_id&&tree[id].right==value_id)
return id;
else if(tree[id*2].left<=value_id&&tree[id*2].right>=value_id)
return find(id*2,value_id);
else if(tree[id*2+1].left<=value_id&&tree[id*2+1].right>=value_id)
return find(id*2+1,value_id);
exit(1);
}
void add(int id,int b)
{
int i=find(1,id);
while(i>0)
{
tree[i].value+=b;
i/=2;
}
return ;
}
int sum(int id,int l,int r)
{
if(l==tree[id].left&&r==tree[id].right)
return tree[id].value;
bool b1=false,b2=false;
if(tree[id*2].left<=l&&tree[id*2].right>=l)
b1=true;
if(tree[id*2+1].left<=r&&tree[id*2+1].right>=r)
b2=true;
if(b1&&!b2)
return sum(id*2,l,r);
else if(!b1&&b2)
return sum(id*2+1,l,r);
else if(b1&&b2)
return sum(id*2,l,tree[id*2].right)+sum(id*2+1,tree[id*2+1].left,r);
else if(!b1&&!b2)
return 0;
exit(1);
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
build(1,1,n);
for(int i=1;i<=m;i++)
{
int b;
cin>>b;
if(b==1)
{
int x,y;
cin>>x>>y;
add(x,y);
}
else if(b==2)
{
int l,r;
cin>>l>>r;
cout<<sum(1,l,r)<<"\n";
}
}
}