Cod sursa(job #733341)

Utilizator deneoAdrian Craciun deneo Data 11 aprilie 2012 21:10:33
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
using namespace std;

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

#define MAXN 100100

int arb[MAXN], n, m;

int query(int k) {
    int sum = 0;
    while(k > 0) {
        sum += arb[k];
        k = k - (k & (-k));
    }
    return sum;
}

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

int search(int sum) {
    int rez, step;
    for (step = 1; step <= n; step *= 2);
    for (rez = 0; step; step /= 2) {
        if (rez + step <= n)
            if (sum >= arb[rez + step]) {
                rez += step;
                sum -= arb[rez + step];
            }
    }
    return rez;
}

int main() {
    int i, a, op, b, add;
    fin >> n >> m;
    for (i = 1; i <= n; ++i) {
        fin >> a;
        update(i, a);
    }
    for (i = 1; i <= m; ++i) {
        fin >> op;
        switch (op) {
            case 0: {
                fin >> a >> add;
                update(a, add);
                break;
            }
            case 1: {
                fin >> a >> b;
                fout << query(b) - query(a - 1) << "\n";
                break;
            }
            case 2: {
                fin >> a;
                fout << search(a) << "\n";
                break;
            }
        }
    }
    fout.close();
    return 0;
}