Cod sursa(job #2285053)

Utilizator preda.andreiPreda Andrei preda.andrei Data 17 noiembrie 2018 23:08:51
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>
#include <vector>

using namespace std;

int Lsb(int num)
{
    return num & -num;
}

void Add(vector<int> &bit, int pos, int val)
{
    while (pos < (int)bit.size()) {
        bit[pos] += val;
        pos += Lsb(pos);
    }
}

int Sum(const vector<int> &bit, int pos)
{
    auto sum = 0;
    while (pos > 0) {
        sum += bit[pos];
        pos -= Lsb(pos);
    }
    return sum;
}

int FindSumPos(const vector<int> &bit, int sum)
{
    auto pos = 0;
    auto power = (1 << 25);

    while (power > 0) {
        auto next_pos = pos + power;
        power >>= 1;

        if (next_pos < (int)bit.size() && Sum(bit, next_pos) < sum) {
            pos = next_pos;
        }
    }

    pos += 1;
    return (pos < (int)bit.size() && Sum(bit, pos) == sum) ? pos : -1;
}

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

    int nums, queries;
    fin >> nums >> queries;

    vector<int> bit(nums + 1, 0);
    for (int i = 0; i < nums; i += 1) {
        int val;
        fin >> val;
        Add(bit, i + 1, val);
    }

    for (int i = 0; i < queries; i += 1) {
        int type, a, b;
        fin >> type;

        if (type == 0) {
            fin >> a >> b;
            Add(bit, a, b);
        } else if (type == 1) {
            fin >> a >> b;
            fout << Sum(bit, b) - Sum(bit, a - 1) << "\n";
        } else {
            fin >> a;
            fout << FindSumPos(bit, a) << "\n";
        }
    }

    return 0;
}