Cod sursa(job #220979)

Utilizator Bogdan_CCebere Bogdan Bogdan_C Data 13 noiembrie 2008 22:10:06
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
int c[100001],n,m,poz;

void update(int locat,int val)
      {int loc=locat;
      poz=0;
       while(loc<=n)
        {c[loc]+=val;
          loc+=((loc^(loc-1))&loc);     }}

int interogare(int st)
{int x=st;  poz=0;
 int sum1=0;
  while(x>0)
    {sum1+=c[x];
     x-=((x^(x-1))&x);
    }
return sum1;
}
 int search(int val)
 {
     int j, step;

     for ( step = 1; step < n; step <<= 1 );

     for( j = 0; step; step >>= 1 )
     {
          if( j + step <= n)
          {
             if( val >= c[j+step] )
             {
                 j += step, val -= c[j];
                 if ( !val ) return j;
             }
          }
     }

     return -1;
 }

int main()
{    ifstream in("aib.in");
ofstream out("aib.out");
      in>>n;in>>m; int k,x,y,aux;
      for(int i=1;i<=n;i++)
       {in>>aux;update(i,aux);}
      for(;m;m--)
      {in>>k;
       if(k<2)
        {in>>x>>y;
         if(k==0) update(x,y);
         else out<<(interogare(y)-interogare(x-1))<<'\n';}
       else {in>>x;out<<search(x)<<'\n';}
      }

      return 0;
}