Cod sursa(job #2229810)

Utilizator gabriel-mocioacaGabriel Mocioaca gabriel-mocioaca Data 8 august 2018 10:24:53
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#define cin in
#define cout out

using namespace std;

int n, tree[100005] = {0};

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

int sum(int k) {
    int s = 0;
    while (k >= 1) {
        s += tree[k];
        k -= k & -k;
    }
    return s;
}

int query(int a, int b) {
    return sum(b) - sum(a - 1);
}

int srch(int a){
    int l = 1, r = n;
    while (l <= r){
        int k = (l + r) / 2;
        int s = sum(k);
        if (s == a)
            return k;
        if (s < a)
            l = k + 1;
        else
            r = k - 1;
    }
    return -1;
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

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

    int m, i, x, op, k, a, b;
    cin >> n >> m;

    for (i = 1; i <= n; ++i) {
        cin >> x;
        add(i, x);
    }

    for (i = 1; i <= m; ++i) {
        cin >> op;
        if (op == 0) {
            cin >> k >> x;
            add(k, x);
        }
        else {
            if (op == 1) {
                cin >> a >> b;
                cout << query(a, b) << '\n';
            }
            else {
                cin >> a;
                cout << srch(a) << '\n';
            }
        }
    }
}