Cod sursa(job #1100997)

Utilizator muresan_bogdanMuresan Bogdan muresan_bogdan Data 7 februarie 2014 19:33:09
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<iostream>
#include<fstream>
using namespace std;

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

int arb[100001], n, m, i, c, a, b;

void update(int idx, int val) {
    while(idx <= n) {
        arb[idx] += val;
        idx += (idx & -idx);
    }
}

int read(int idx) {
    int sol = 0;
    while(idx > 0) {
        sol += arb[idx];
        idx -= (idx & -idx);
    }
    return sol;
}

int look(int val) {
    int i, step;

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

int main() {
    fin >> n >> m;
    for(i = 1; i <= n; i++) {
        fin >> a;
        update(i, a);
    }
    for(i = 1; i <= m; i++) {
        fin >> c;
        if(c == 0) {
            fin >> a >> b;
            update(a, b);
        }
        if(c == 1) {
            fin >> a >> b;
            fout << read(b) - read(a - 1) << '\n';
        }
        if(c == 2) {
            fin >> a;
            fout << look(a) << '\n';
        }
    }
    fin.close();
    fout.close();
    return 0;
}