Cod sursa(job #334684)

Utilizator klamathixMihai Calancea klamathix Data 27 iulie 2009 17:19:25
Problema Arbori indexati binar Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include<cstdio>

#define MAXN 100001

int i ,j ,  N , M , Tree[MAXN] , type , Sum , a , b , X;

int bits ( int X ) { 
    return ( X  & ( X - 1 ) ^ X );
}

void update ( int poz , int value ) {
     
     
     while ( poz <= N ) {
           Tree[poz] += value;
           poz += ( bits ( poz ) ) ;
           }
}

int query ( int a ) {
    int poz = a , Result = 0;
    
    while ( poz > 0) { 
          Result += Tree[poz];
          poz -= bits ( poz ) ;          
          }
    return Result;
}

int query2 ( int Sum ) { 
    
    int left = 1 , right = N , mid , last = -1;
    
    while ( left <= right ) { 
          mid = ( left + right ) >> 1;
          if( query( mid ) == Sum ) last = mid , right = mid - 1;
              else if ( query ( mid ) < Sum  ) left = mid + 1;
                   else if ( query ( mid ) > Sum ) right = mid - 1;
              }
              
    return last;
    
}

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",&X);
         update ( i , X );
         }
    
    for ( ; M -- ; ) {
        scanf("%d",& type );
        
        if ( type == 2 ) {
             scanf("%d",&Sum);
             printf("%d\n",query2 (Sum) );
             }
        else {
             if ( type == 0 ) {
                  scanf("%d %d ",&a ,&b );
                  update( a , b );
                  
                  }
             else {
                  scanf("%d %d",&a ,&b);
                  printf("%d\n", query(b) - query ( a - 1 ) );
                  }
             }
        }
return 0;
}