#include<iostream>
#include<string.h>
using namespace std;
const int N=1e6+10;
int n,m;
struct tree{
int sum,l,r;
}tr[4*N+1];
int a[N+1];
void push_up(int now)
{
tr[now].sum=tr[2*now].sum+tr[2*now+1].sum;
}
void build(int x,int l,int r)
{
tr[x].r=r;
tr[x].l=l;
if(r==l){
tr[x].sum=a[r];
return;
}
else{
int mid=(r+l)/2;
build(x*2,l,mid);
build(x*2+1,mid+1,r);
push_up(x);
return ;
}
}
int ask(int x,int l,int r)
{
if(tr[x].l>=l&&tr[x].r<=r)return tr[x].sum;
else{
int sum=0;
int mid=(tr[x].l+tr[x].r)/2;
if(mid+1<=r)sum+=ask(2*x+1,l,r);
if(mid>=l)sum+=ask(2*x,l,r);
return sum;
}
}
void change(int now,int poi,int k)//poi�ǽڵ�λ�ã�k��Ҫ�ӵ�ֵ��now��ǰ�߶���������
{
if(tr[now].r==tr[now].l)
{
tr[now].sum+=k;
a[poi]+=k;
return ;
}
int mid=(tr[now].r+tr[now].l)/2;
if(mid>=poi)change(now*2,poi,k);
else change(now*2+1,poi,k);
push_up(now);
}
int main(void)
{
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
build(1,1,n);
while(m--)
{
int temp,x,k;
cin>>temp>>x>>k;
if(temp==1)change(1,x,k);
else if(temp==2)
{
int ans=ask(1,x,k);
cout<<ans<<endl;
}
}
return 0;
}
存一下之前自己的线段树代码
最新推荐文章于 2024-08-27 17:53:55 发布