Cod sursa(job #1257953)

Utilizator radu_cebotariRadu Cebotari radu_cebotari Data 8 noiembrie 2014 12:38:30
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include<fstream>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
const int NMAX = 100009;

int v[NMAX],n,m;

void update(int poz,int val)
{

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

int query(int poz)
{

    int C = 0 , S = 0;
    while(poz > 0){
        S += v[poz];
        while(!(poz & (1 <<C ))) C++;
        poz -= (1<<C);
        C++;
    }
    return S;
}


int query2(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()
{

    in>>n>>m;
    int x;
    for(int i = 1 ; i <= n ; i++)
    {
        in>>x;
        update(i,x);
    }
    int tip,a,b;
    for(int i = 1 ; i <= m ; i++){
        in>>tip;
        if(tip == 0){
            in>>a>>b;
            update(a,b);
        }
        else if(tip == 1){
            in>>a>>b;
            out<<query(b)-query(a-1)<<"\n";
        }
        else{
            in>>a;
            out<<query2(a)<<"\n";
        }
    }
    return 0;
}