Cod sursa(job #2589580)

Utilizator copanelTudor Roman copanel Data 26 martie 2020 16:28:00
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>

const int L = 17;
int aib[100001];

constexpr int LSB(int p) {
    return p & (-p);
}

int cauta(int n, int x) {
    if (x == 0) {
        return -1;
    }
    int p = 0, pas = 1 << L;
    while (pas != 0) {
        if (p + pas <= n && aib[p + pas] <= x) {
            p += pas;
            x -= aib[p];
        }
        pas >>= 1;
    }
    if (x != 0) {
        return -1;
    }
    return p;
}

int query(int n, int p) {
    int s = 0;
    while (p != 0) {
        s += aib[p];
        p -= LSB(p);
    }

    return s;
}

void update(int n, int p, int val) {
    while (p <= n) {
        aib[p] += val;
        p += LSB(p);
    }
}

int main() {
    std::ifstream fin("aib.in");
    std::ofstream fout("aib.out");
    int n, m;

    fin >> n >> m;
    for (int i = 1; i <= n; i++) {
        int x;
        fin >> x;
        update(n, i, x);
    }
    for (; m > 0; m--) {
        int op;
        fin >> op;
        switch (op) {
        case 0: {
            int a, b;
            fin >> a >> b;
            update(n, a, b);
            break;
        }
        case 1: {
            int a, b;
            fin >> a >> b;
            fout << query(n, b) - query(n, a - 1) << '\n';
            break;
        }
        case 2: {
            int a;
            fin >> a;

            fout << cauta(n, a) << '\n';
            break;
        }
        }
    }
    return 0;
}