Cod sursa(job #494134)

Utilizator giuliastefGiulia Stef giuliastef Data 20 octombrie 2010 20:14:51
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
// Arbori indexati binar

#include <iostream>
#include <fstream>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");

int arb[100100],m,n,x,a,b,k;

void update (int poz,int val)
{
     k=0;
     while(poz<=n)
     {
      arb[poz]+=val;
      while( !(poz&1<<k) ) k++;
      poz=poz+(1<<k);
      k++;
     }
}
int query (int poz)
{
    int s=0; 
    k=0;
    while(poz>0)
    {
     s=s+arb[poz];
     while( !(poz&1<<k) ) k++;
     poz=poz-(1<<k);
     k++;
    }
    return s;
}
int search(int val)
{
    int i, pas;
    for(pas=1;pas<n;pas<<=1);
    for(i=0;pas;pas>>=1)
     if(i+pas<=n)
      if(val>=arb[i+pas])
      {
       i+=pas, val-=arb[i];
       if (!val) return i;
      }
    return -1;
}
int main()
{
    int i;
    f>>n>>m;
    for(i=1;i<=n;i++)
    {
     f>>x;
     update(i,x);
    }
    for(i=1;i<=m;i++)
    {
     f>>x;
     if(x==0)
     {
             f>>a>>b;
             update(a,b);
     }
     else
     if(x==1)
     {
             f>>a>>b;
             g<<query(b)-query(a-1)<<"\n";
     }
      else
       if(x==2)
       {
               f>>a;
               g<<search(a)<<"\n";
       }
    }
    return 0;
}