Cod sursa(job #3213548)

Utilizator juniorOvidiu Rosca junior Data 13 martie 2024 11:39:30
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
// Cu functie inline in loc de macro
// 100 p infoarena

#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

int n, operatii, v, i, pi;
int arb[dim];
ifstream fin("aib.in");
ofstream fout("aib.out");

inline int p2(int x) {
    return (x ^ (x - 1)) & x;
}

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 Cauta(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 >> operatii;
    for (i = 1; i <= n; i++) {
        fin >> v;
        Adauga(i, v); // Adunam v la 0.
    }
    for (pi = 1; pi < n; pi <<= 1)
        ;           // pasul initial pentru cautare
    while (operatii--) {   // 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 << Cauta(a) << '\n';
        }
    }
}