Cod sursa(job #3367985)

Utilizator rapidu36Victor Manz rapidu36 Data 12 octombrie 2026 16:29:26
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 kb
#include <fstream>
#include <vector>

using namespace std;

void actualizare(vector <int> &aib, int poz, int val) {
    int n = (int)aib.size() - 1;
    while (poz <= n) {
        aib[poz] += val;
        int p2 = (poz & (-poz));
        poz += p2;
    }
}

int interogare(vector <int> &aib, int poz) {
    int suma = 0;
    while (poz != 0) {
        suma += aib[poz];
        int p2 = (poz & (-poz));
        poz -= p2;
    }
    return suma;
}

int interogare_poz_min(vector <int> &aib, int val) {
    // cautam cea mai mare pozitie i pentru care suma v[1]+..+v[i] < val
    int n = (int)aib.size() - 1, copie_val = val;
    int p2 = 1;
    while (p2 <= n / 2) {
        p2 *= 2;
    }
    int poz = 0;
    while (p2 != 0) {
        if (poz + p2 <= n && aib[poz+p2] < val) {
            val -= aib[poz+p2];
            poz += p2;
        }
        p2 /= 2;
    }
    if (poz < n && interogare(aib, poz + 1) == copie_val) {
        return poz + 1;
    }
    return -1;
}

int main() {
    ifstream fin("aib.in");
    int n, q;
    fin >> n >> q;
    vector <int> aib(n + 1, 0);
    for (int i = 0; i < n; i++) {
        int val;
        fin >> val;
        actualizare(aib, i + 1, val);
    }
    ofstream fout("aib.out");
    for (int i = 0; i < q; i++) {
        int tip;
        fin >> tip;
        if (tip == 0) {
            int poz, val;
            fin >> poz >> val;
            actualizare(aib, poz, val);
        } else if (tip == 1) {
            int a, b;
            fin >> a >> b;
            fout << interogare(aib, b) - interogare(aib, a - 1) << "\n";
        } else {
            int val;
            fin >> val;
            fout << interogare_poz_min(aib, val) << "\n";
        }
    }
    fin.close();
    fout.close();
    return 0;
}