Cod sursa(job #293031)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 31 martie 2009 21:35:22
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<fstream>
using namespace std;
int v[100010],m,n,i,j,poz,x,st,dr,op;
int minim (int a,int b)
 { if(a<b) return a;
   return b;
 }
void update(int poz,int val)

  { int k=0;

      while(poz<=n)
       {v[poz]+=val;
        while(!(poz&(1<<k))) k++;
        poz+=(1<<k);
        k++;
       }
  }
int query (int poz)
 { int k=0,s=0;

    while(poz>0)

     { s+=v[poz];
       while(!(poz&(1<<k))) k++;
       poz-=(1<<k);
       k++;
     }
   return s;
 }

 int search(int val)  
 {  
     int i,step;
       
     for (step=1;step<n;step<<=1);
       
     for(i=0;step;step>>=1)
     {  
          if(i+step<=n)
          {  
             if(val>=v[i+step])
             {  
                 i+=step,val-=v[i];
                 if(!val) return i;
             }  
          }  
     }  
       
     return -1;  
}

int main()
{
ifstream f("aib.in");
ofstream g("aib.out");
f>>n>>m;

for(i=1;i<=n;i++)

 { f>>x; update(i,x);}

for(i=1;i<=m;i++)
 { f>>op;

  if(!op) { f>>poz>>x; update(poz,x);}

   else if(op==1)
          { f>>st>>dr;
            g<<query(dr)-query(st-1)<<'\n';}

      else {f>>x; g<<search(x)<<'\n';}
 }
f.close();
g.close();
return 0;
}