Cod sursa(job #3250391)

Utilizator stefanrotaruRotaru Stefan-Florin stefanrotaru Data 20 octombrie 2024 16:20:51
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream f("aib.in");
ofstream g("aib.out");

int n, m, val;

vector <int> AIB;

int zeros(int i)
{
    return i & -i;
}

void update(int poz, int val)
{
    for (; poz <= n; poz += zeros(poz)) {
        AIB[poz] += val;
    }
}

int query(int poz)
{
    int suma = 0;

    for (; poz; poz -= zeros(poz)) {
        suma += AIB[poz];
    }

    return suma;
}

int cautare(int val)
{
    int rez = 0, step = 1;


    for (; step <= n; step <<= 1) {

    }

    for (; step; step >>= 1) {
        if (rez + step <= n && AIB[rez + step] <= val) {
            val -= AIB[rez + step];
            rez += step;

            if (!val) {
                 return rez;
            }
        }
    }

    return -1;
}

int main()
{
    f >> n >> m;

    AIB.resize(n + 5);

    for (int i = 1; i <= n; ++i) {
        f >> val;

        update(i, val);
    }

    while (m--) {
        int v, a, b;

        f >> v;

        if (v == 0) {
            f >> a >> b;

            update(a, b);
        }
        else if (v == 1) {
            f >> a >> b;

            g << query(b) - query(a - 1) << '\n';
        }
        else {
            f >> a;

            g << cautare(a) << '\n';
        }
    }

    return 0;
}