Cod sursa(job #1901023)

Utilizator savigunFeleaga Dragos-George savigun Data 3 martie 2017 18:30:33
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
int n, m, bit[100001];
const int L = 1 << 17;

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

int query(int idx) {
    int sum = 0;
    while (idx) {
        sum += bit[idx];
        idx -= idx & (-idx);
    }

    return sum;
}

int search(int val) {
    int step = L;
    int i = 0;
    while (step) {
        if (i + step <= n && bit[i + step] <= val) {
            i += step;
            val -= bit[i];
            if (val == 0) return i;
        }
        step /= 2;
    }
}

int main() {
    in >> n >> m;
    for (int i = 1, x; i <= n; ++i) {
        in >> x;
        update(i, x);
    }

    for (int i = 1, o, a, b; i <= m; ++i) {
        in >> o >> a;
        if (o == 0) {
            in >> b;
            update(a, b);
        } else if (o == 1) {
            in >> b;
            out << query(b) - query(a - 1) << '\n';
        } else {
            int r = search(a);
            if (!r) out << -1 << '\n'; else out << r << '\n';
        }
    }

    return 0;
}