Cod sursa(job #2663061)

Utilizator razvan242Zoltan Razvan-Daniel razvan242 Data 25 octombrie 2020 11:24:27
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

string name = "aib";
ifstream fin(name + ".in");
ofstream fout(name + ".out");

int n, m;
vector<int> v;
vector<int> aib;

void init() {
    v = vector<int>(n + 1);
    aib = vector<int>(n + 1);
}

int lsb(int val) {
    return val & (-val);
}

void update(int pos, int val) {
    for (int idx = pos; idx <= n; idx += lsb(idx)) {
        aib[idx] += val;
    }
}

int query(int pos) {
    /// suma de la 1 la pos
    int sum = 0;
    for (int idx = pos; idx > 0; idx -= lsb(idx)) {
        sum += aib[idx];
    }
    return sum;
}

void read() {
    fin >> n >> m;
    init();

    for (int i = 1; i <= n; ++i) {
        fin >> v[i];
    }

    for (int i = 1; i <= n; ++i) {
        update(i, v[i]);
    }
}

int searchPosition(int sum) {
    int sol = 0;
    int step = 1;

    /// step - cea mai mare putere a lui 2 <= n
    while ((step << 1) <= n) {
        step <<= 1;
    }
    while (step > 0) {
        if (sol + step <= n && sum >= aib[sol + step]) {
            sol += step;
            sum -= aib[sol];
            if (sum == 0) {
                return sol;
            }
        }
        step >>= 1;
    }

    return -1;
}

void solveQueries() {
    int op, x, y;
    while (m--) {
        fin >> op;
        if (op == 0) {
            fin >> x >> y;
            update(x, y);
        }
        else if (op == 1) {
            fin >> x >> y;
            fout << query(y) - query(x - 1) << '\n';
        }
        else if (op == 2) {
            fin >> x;
            fout << searchPosition(x) << '\n';
        }
    }
}

int main()
{
    read();
    solveQueries();
    return 0;
}