Cod sursa(job #3356791)

Utilizator rapidu36Victor Manz rapidu36 Data 4 iunie 2026 10:24:31
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <fstream>
#include <iostream>
#include <vector>

using namespace std;

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

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

int interogare_poz_min(vector <int> &aib, int s) {
    int n = (int)aib.size() - 1;
    // cautam (binar) cel mai mare p cu propr. ca suma pana la p e < s
    int rez = 0, p2 = 1, s_c = s;
    while (p2 <= n / 2) {
        p2 *= 2;
    }
    while (p2 >= 1) {
        if (rez + p2 <= n && aib[rez+p2] < s_c) {
            s_c -= aib[rez+p2];
            rez += p2;
        }
        p2 /= 2;
    }
    if (rez == n || interogare(aib, rez + 1) > s) {
        rez = -1;
    } else {
        rez++;
    }
    return rez;
}

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