Cod sursa(job #470332)

Utilizator vlad.maneaVlad Manea vlad.manea Data 13 iulie 2010 11:10:40
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream.h>

#define nmax 100005

int N, Sum[nmax];

inline int digits2(int k) {

    return (k & (k - 1)) ^ k;

}

void add(int i, int v) {

    for (int k = i; k <= N; k += digits2(k)) {
        Sum[k] += v;
    }

}

int sum(int i, int j) {

    int sum = 0;

    for (int k = j; k >= 1; k -= digits2(k)) {
        sum += Sum[k];
    }

    for (int k = i - 1; k >= 1; k -= digits2(k)) {
        sum -= Sum[k];
    }

    return sum;

}

int find(int v) {

    for (int l = 1, r = N; l <= r;) {
        int m = (l + r) >> 1;
        int s = sum(1, m);
        if (s < v) {
            l = m + 1;
        } else if (s > v) {
            r = m - 1;
        } else {
            return m;
        }
    }

    return -1;

}

int main() {

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

    int a, b, n, m;
    
    fin >> N >> m;

    for (int n = 1; n <= N; ++n) {
        fin >> a;
        add(n, a);
    }

    while (m--) {
        fin >> b;
        switch (b) {
            case 0:
                fin >> a >> b;
                add(a, b);
                break;
            case 1:
                fin >> a >> b;
                fout << sum(a, b) << '\n';
                break;
            case 2:
                fin >> a;
                fout << find(a) << '\n';
                break;
        }
    }

    fin.close();
    fout.close();

    return 0;
}