Cod sursa(job #739818)

Utilizator ion824Ion Ureche ion824 Data 23 aprilie 2012 22:17:19
Problema Arbori indexati binar Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include<cstdio>
#define dim 100001
int arb[dim],c,s,n,m;

void update(int poz,int val)
{
   c=0;
   while( poz<=n )
   {
     arb[poz]+=val;
     while( !(poz & (1<<c)) )c++;
     poz += (1<<c);
     c += 1;       
   }     
}

int query(int poz){
   c=s=0;
   while( poz>0 )
          {
          s+=arb[poz];
          while( !(poz & (1<<c)) )c++;
          poz -= (1<<c);
          c++;        
          }       
 return s;   
}

int search(int sum)
{
  int left=1,right=n,mid;
  
  while(right-left>1)
    {
     mid=(right+left)>>1;                
     if(query(mid)<sum)left=mid;
       else right=mid;
    }
                     
   if(query(left)==sum)return left; 
   if(query(right)==sum)return right; 
   return -1;     
}

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