Cod sursa(job #708881)

Utilizator ion824Ion Ureche ion824 Data 7 martie 2012 14:32:15
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include<cstdio>
#define nmax 100005
int n,m,a[nmax],arb[4*nmax+50],x,start,finish,index,pos,sum,p;

void update(int nod,int left,int right){
     if( left == right){
         arb[nod]+=x;
         return ;
         }
     int div=(left+right)/2;
     
     if(pos<=div)update(2*nod,left,div);
        else update(2*nod+1,div+1,right);
     
     arb[nod]=arb[2*nod]+arb[2*nod+1];
     }

void query(int nod,int left,int right){
     if(start<=left && right<=finish){
                    sum+=arb[nod];
                    return ;
                    }
     int div=(left+right)/2;               
     
     if(start<=div)query(2*nod,left,div);
     if(finish>div)query(2*nod+1,div+1,right);     
     }

void search1(int nod,int right){
     if( arb[nod]==p ){
           index=right;
           }
      int div=(1+right)/2;
      if(arb[2*nod]>=p)search1(2*nod,div);          
     }

int main(void){
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    int n,m,i,q;
    scanf("%d %d\n",&n,&m);
    for(i=1;i<=n;++i){
                      scanf("%d ",&x);
                      pos=i;
                      update(1,1,n);
                      }
    for(i=1;i<=m;++i){
                      scanf("%d %d ",&x,&p);
                      if(x==0){ scanf("%d\n",&q); x=q; pos=p; update(1,1,n); }
                      if(x==1){ scanf("%d\n",&q); sum=0; start=p; finish=q; query(1,1,n); printf("%d\n",sum); }                                                                                                 
                      if(x==2){ index=0; search1(1,n); printf("%d\n",index); }
                      }
    return 0;
}