Cod sursa(job #1758061)

Utilizator BLz0rDospra Cristian BLz0r Data 16 septembrie 2016 13:44:45
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
using namespace std;

#define Nmax 100002

ifstream fin( "aib.in" );
ofstream fout( "aib.out" );

int N, AIB[Nmax];

inline int LSB( int x ){
    return ( x & -x );
}

void AddVal( int poz, int val ){

    for( int i = poz; i <= N; i += LSB(i) )
        AIB[i] += val;
}

int Sum( int poz ){

    int val = 0;

    for( int i = poz; i > 0; i -= LSB(i) )
        val += AIB[i];

    return val;
}

int Query( int st, int dr ){
    return Sum( dr ) - Sum( st-1 );
}

int Bsearch( int val ){

    int st = 1, dr = N, Sol = -1;

    while( st <= dr ){
        int mid = ( st + dr ) >> 1;
        int x = Sum( mid );

        if( val == x )
            Sol = mid;

        if( x < val )
            st = mid + 1;
        else
            dr = mid - 1;
    }

    return Sol;
}

int main(){

    int M, x, a, b;

    fin >> N >> M;

    for( int i = 1; i <= N; ++i ){
        fin >> x;
        AddVal( i, x );
    }

    while( M-- ){
        fin >> x;

        switch(x){
            case 0:
                fin >> a >> b;
                AddVal( a, b );
                break;

            case 1:
                fin >> a >> b;
                fout << Query( a, b ) << "\n";
                break;

            case 2:
                fin >> a;
                fout << Bsearch( a ) << "\n";
                break;
        }
    }

    return 0;
}