Cod sursa(job #2885275)

Utilizator BeilandArnoldArnold Beiland BeilandArnold Data 5 aprilie 2022 19:33:17
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 kb
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;

void update(int n, vector<int> &aib, int pos, int increment)
{
    while (pos <= n) {
        aib[pos] += increment;
        pos += (pos & -pos);
    }
}

int query(const vector<int> &aib, int pos)
{
    int s = 0;
    while (pos != 0) {
        s += aib[pos];
        pos -= (pos & -pos);
        // pos &= (pos - 1);
    }
    return s;
}

int query2(int n, const vector<int> &aib, int a)
{
    int bitmask = 1;
    while (bitmask <= n)
        bitmask <<= 1;
    bitmask >>= 1;

    int rest = a;
    int ind = 0;

    int goodInd = -1;

    while (bitmask != 0) {
        if (ind + bitmask > n) {
            bitmask >>= 1;
        }
        else if (aib[ind + bitmask] > rest) {
            bitmask >>= 1;
        }
        else if (aib[ind + bitmask] == rest) {
            goodInd = ind + bitmask;
            bitmask >>= 1;
        }
        else {
            rest -= aib[ind];
            ind += bitmask;
            bitmask >>= 1;
        }

    }

    return goodInd;
}

int main()
{
    ifstream fin("aib.in");
    ofstream fout("aib.out");

    int n, m;
    fin >> n >> m;

    vector<int> aib(n+1, 0);

    for (int i = 1; i <= n; ++i) {
        int x;
        fin >> x;
        update(n, aib, i, x);
    }

    for (int i = 0; i < m; ++i) {
        int op;
        fin >> op;

        if (op == 0) {
            int a, b;
            fin >> a >> b;
            update(n, aib, a, b);
        }
        else if (op == 1) {
            int a, b;
            fin >> a >> b;

            if (a == 1)
                fout << query(aib, b) << "\n";
            else {
                fout << query(aib, b) - query(aib, a-1) << "\n";
            }
        }
        else {
            int a;
            fin >> a;

            fout << query2(n, aib, a) << "\n";
        }
    }

    return 0;
}