Cod sursa(job #3357906)

Utilizator TestLicenta123Test Test TestLicenta123 Data 13 iunie 2026 19:42:34
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <fstream>
#include <vector>

int n;
std::vector<int> aib;

void update(int pos, int val) {
    for (int i = pos; i <= n; i += i & -i) {
        aib[i] += val;
    }
}

int query(int pos) {
    int sum = 0;
    for (int i = pos; i > 0; i -= i & -i) {
        sum += aib[i];
    }
    return sum;
}

int find(int val) {
    int pos = 0;
    int sum = 0;
    for (int step = 1 << 17; step > 0; step >>= 1) {
        if (pos + step <= n && sum + aib[pos + step] < val) {
            pos += step;
            sum += aib[pos];
        }
    }
    if (sum + 1 == val) return pos + 1;
    if (query(pos + 1) >= val) return pos + 1;
    return -1;
}

int main() {
    std::ifstream input("aib.in");
    std::ofstream output("aib.out");
    int m;
    input >> n >> m;

    aib.resize(n + 1, 0);
    for (int i = 1; i <= n; ++i) {
        int x;
        input >> x;
        update(i, x);
    }

    while (m--) {
        int q;
        input >> q;
        if (q == 0) {
            int a, b;
            input >> a >> b;
            update(a, b);
        } else if (q == 1) {
            int a, b;
            input >> a >> b;
            output << query(b) - query(a - 1) << '\n';
        } else if (q == 2) {
            int a;
            input >> a;
            int pos = find(a);
            output << pos << '\n';
        }
    }

    return 0;
}