Cod sursa(job #2921619)

Utilizator tzancauraganuTzanca Uraganu tzancauraganu Data 31 august 2022 22:23:52
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <fstream>
#include <vector>
#include <cassert>

using namespace std;

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

void update(int p, int val, vector<int>& V) {
    for (;p > 0 && p < V.size(); p += lsb(p))
        V[p] += val;
}

int query(int p, const vector<int>& V) {
    int sum = 0;
    for (; p > 0; p -= lsb(p))
        sum += V[p];
    return sum;
}

int search(int sum, const vector<int>& V) {
    int p = lsb(V.size() - 1);
    int index = 0, ans = V.size();

    for (; p > 0; p >>= 1) {
        int newIndex = index | p;
        if (newIndex >= V.size())
            continue;
        if (V[newIndex] < sum) {
            sum -= V[newIndex];
            index = newIndex;
            continue;
        }
        if (V[newIndex] == sum) {
            ans = newIndex;
        }
    }

    return ans < V.size() ? ans : -1;
}

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

    int N, M;
    f >> N >> M;

    int MaxIdx = 1;
    for (; MaxIdx < N; MaxIdx <<= 1);

    vector<int> V(MaxIdx + 1);

    for (int i = 1; i <= N; i++) {
        int x;
        f >> x;
        update(i, x, V);
    }

    for (int i = 0; i < M; i++) {
        int op, a, b;
        f >> op >> a;
        if (op <= 1)
            f >> b;
        if (op == 0)
            update(a, b, V);
        else if (op == 1)
            g << query(b, V) - query(a - 1, V) << '\n';
        else
            g << search(a, V) << '\n';
    }

    f.close();
    g.close();
    return 0;
}