codevs1080线段树练习

#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 100010
#define maxm 200020
#define maxx 10010
using namespace std;
int n,m,a[maxn],num;
struct node
{
    int lc,rc;
    int l,r;
    int sum;
}tree[maxm];

void build(int ll,int rr)
{
    int cur=++num;
    tree[cur].l=ll;tree[cur].r=rr;
    if(ll!=rr-1)
      {
          tree[cur].lc=num+1;
          build(ll,(ll+rr)/2);
          tree[cur].rc=num+1;
          build((ll+rr)/2,rr);
          tree[cur].sum=tree[tree[cur].lc].sum+tree[tree[cur].rc].sum;
      }
    else tree[cur].sum=a[ll];
}
void change(int k,int x,int p)
{
    if(tree[k].l==tree[k].r-1)tree[k].sum+=p;
    else 
      {
          if(x<(tree[k].l+tree[k].r)/2)change(tree[k].lc,x,p);
        if(x>=(tree[k].l+tree[k].r)/2)change(tree[k].rc,x,p);
        tree[k].sum=tree[tree[k].lc].sum+tree[tree[k].rc].sum;
      }
}
int find(int k,int ll,int rr)
{
    if(ll<=tree[k].l&&rr>=tree[k].r)return tree[k].sum;
    int ans=0;
    if(ll<(tree[k].l+tree[k].r)/2)ans+=find(tree[k].lc,ll,rr);
    if(rr>(tree[k].l+tree[k].r)/2)ans+=find(tree[k].rc,ll,rr);
    return ans;
}
int main()
{
    cin>>n;
    int i,j,x,y,z;
    for(i=1;i<=n;i++)
      cin>>a[i];
    build(1,n+1);
    cin>>m;
    for(i=1;i<=m;i++)
      {
          cin>>x>>y>>z;
          if(x==1)change(1,y,z);
          if(x==2)cout<<find(1,y,z+1)<<endl;
      }
}

 

posted @ 2016-04-04 20:49  一入OI深似海  阅读(322)  评论(4编辑  收藏  举报