Cod sursa(job #3366783)

Utilizator robert_dumitruDumitru Robert Ionut robert_dumitru Data 4 octombrie 2026 12:07:07
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream> 
#include <iostream> 

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

int n, m;
int aib[100005];

int query(int p) {
    int answer(0);
    while (1 <= p) {
        answer += aib[p];
        p -= (p & (-p));
    }

    return answer;
}

void update(int p, int value) {
    while (p <= n) {
        aib[p] += value;
        p += (p & (-p));
    }
}


int main() {
    int q, x, y;

    fin >> n >> m;
    for (int i = 1; i <= n; i++) {
        fin >> x;
        update(i, x);
    }
    for (int i = 1; i <= m; i++) {
        fin >> q;
        if (q == 0) {
            fin >> x >> y;
            update(x, y); 
        }
        else if (q == 1) {
            fin >> x >> y;
            fout << query(y) - query(x - 1) << "\n";
        }
        else {
            fin >> x;
            int l(1), r(n), m, k(-1);
            while (l <= r) {
                m = (l + r) / 2;
                int sum = query(m);
                if (sum >= x) {
                    r = m - 1;
                    if (sum == x) {
                        k = m;
                    }
                }
                else {
                    l = m + 1;
                }
            }

            fout << k << "\n";
        }
    }

    fout.close();

}