Cod sursa(job #2753150)

Utilizator lucamLuca Mazilescu lucam Data 21 mai 2021 11:42:15
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>

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

const int N = 1e5 + 1;
const int L = 16;

int n;
struct Aib {
    int data[N];
    void update(int p, int val);
    int query(int p);
    int exact_value_min_idx(int val);
} aib;

void Aib::update(int p, int val) {
    while (p <= n) {
        data[p] += val;
        p += p & (-p);
    }
}

int Aib::query(int p) {
    int ret = 0;
    while (p) {
        ret += data[p];
        p -= p & (-p);
    }
    return ret;
}

int Aib::exact_value_min_idx(int val) {
    int r = 0, step = 1 << 16;
    while (step) {
        if (r + step <= n && aib.data[r + step] <= val) {
            r += step;
            val -= aib.data[r];
        }
        step >>= 1;
    }
    return !val && r ? r : -1;
}

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

    for (int i = 0; i < m; ++i) {
        int op, a, b;
        in >> op;
        switch (op) {
        case 0:
            in >> a >> b;
            aib.update(a, b);
            break;
        case 1:
            in >> a >> b;
            out << aib.query(b) - aib.query(a - 1) << '\n';
            break;
        case 2:
            in >> a;
            out << aib.exact_value_min_idx(a) << '\n';
        }
    }
}