Cod sursa(job #2968510)

Utilizator juniorOvidiu Rosca junior Data 21 ianuarie 2023 13:24:57
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>

using namespace std;

#define dim 100001
// 2^n, unde n este numarul de 0 de la final in scrierea in baza 2 a lui x
#define p2(x) ((x ^ (x - 1)) & x)

int N, O, T, i, pi;
int Arb[dim];
ifstream fin("aib.in");
ofstream fout("aib.out");

int Suma(int p) { // suma pana la pozitia p
    int i, s = 0;
    for (i = p; i > 0; i -= p2(i))
        s += Arb[i];
    return s;
}

void Adauga(int p, int v) {
    int i;
    for (i = p; i <= N; i += p2(i))
        Arb[i] += v;
}

int Search(int v) {
    int i, p = pi;
    for (i = 0; p; p >>= 1)
        if (i + p <= N)
            if (Arb[i + p] <= v) {
                i += p, v -= Arb[i];
                if (v == 0)
                    return i;
            }
    return -1;
}

int main() {
    int cod, a, b;
    fin >> N >> O;
    for (i = 1; i <= N; i++) {
        fin >> T;
        Adauga(i, T); // Adunam T la 0.
    }
    for (pi = 1; pi < N; pi <<= 1)
        ;           // pasul initial pentru cautare
    while (O--) {   // operatiile
        fin >> cod; // codul operatiei
        if (cod < 2) {
            fin >> a >> b;
            if (cod == 0)
                Adauga(a, b);
            else
                fout << Suma(b) - Suma(a - 1) << '\n';
        } //
        else {
            fin >> a;
            fout << Search(a) << '\n';
        }
    }
}