Cod sursa(job #364612)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 16 noiembrie 2009 17:15:42
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <stdio.h>
#define Nmax 100002

int c[Nmax];
int n,m,i,a,b,op;

void add(int i,int a){
	int z=0;
   while( i<=n ){
   	c[i] += a;
      while( !( i&(1 << z) ) ) z++;
      i += (1<<z);
      z++;
   }
}

int query(int i){
	int z=0,sum=0;
   while( i>0 ){
   	sum += c[i];
      while( !( i&(1 << z) ) ) z++;
      i -= (1<<z);
      z++;
   }
   return sum;
}

int search(int a){
	int i,p;
   for( p=1; p < n; ) p <<=1;

   for(i=0; p; p >>=1 )
     if( i+p <=n )
       if(a >= c[i+p]){
       	i += p;
         a -= c[i];
         if( a == 0 ) return i;
       }
   return -1;
}

int main(){
	freopen("aib.in","r",stdin);
   freopen("aib.out","w",stdout);
   scanf("%d%d",&n,&m);
   for(i=1;i<=n;++i){
   	scanf("%d",&a);
      add(i,a);
   }
   for(i=1;i<=m;++i){
   	scanf("%d",&op);
      if(op == 2){
          scanf("%d",&a);
      	 printf("%d\n",search(a));
      }else{
      	scanf("%d%d",&a,&b);
         if(op == 0) add(a,b);
         else printf("%d\n",query(b)-query(a-1));
      }
   }

   fclose(stdin); fclose(stdout);
   return 0;
}