Cod sursa(job #1394454)

Utilizator valiro21Valentin Rosca valiro21 Data 20 martie 2015 12:30:35
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>

#define NMax 100005

using namespace std;

long aib[NMax], n, m, a, b, ok, x;

void Update (int poz, int val) {
    while (poz < NMax) {
        aib[poz]+= val;
        poz += poz&(-poz);
    }
}

int Querry (int poz) {
    int sum = 0;

    while (poz) {
        sum += aib[poz];
        poz -= poz & (-poz);
    }

    return sum;
}

long bfind ( long left, long right, long s ) {
    long middle, S;
    if ( s < Querry ( left ) || Querry ( right ) < s )
        return -1;

    while ( left <= right ) {
        middle = left + ( right - left ) / 2;
        S = Querry ( middle );

        if ( S == s )
            return middle;
        else if ( s < S )
            right = middle - 1;
        else
            left = middle + 1;
    }

    return -1;
}

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

    fin >> n >> m;
    for ( long i = 1; i <= n; i++ ) {
        fin >> x;
        Update ( i, x );
    }

    for ( long i = 1; i <= m; i++ ) {
        fin >> ok;
        if ( ok < 2 ) {
            fin >> a >> b;
            if ( ok == 0 )
                Update ( a, b );
            else
                fout << Querry ( b ) - Querry ( a - 1 ) << '\n';
        }
        else {
            fin >> a;
            fout << bfind ( 1, n, a ) << '\n';
        }
    }

    return 0;
}