Cod sursa(job #3343052)

Utilizator paul_serbanSerban Paul Gabriel paul_serban Data 26 februarie 2026 13:47:30
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <iostream>
#include <fstream>

std::ifstream fin{"aib.in"};
std::ofstream fout{"aib.out"};

#define MAX_N 100000

int v[MAX_N + 5];
int sp[MAX_N + 5];
int n, m;

void update(const int x, const int p) {
    for (int i = p; i <= n; i += (i & -i))
        sp[i] += x;
}

int query(const int x) {
    int s = 0;
    for (int i = x; i > 0; i -= (i & -i))
        s += sp[i];

    return s;
}

void init() {
    for (int i = 1; i <= n; i++) {
        for (int j = i; j <= n; j += (j & -j)) {
            sp[j] += v[i];
        }
    }
}

int binarySearch(int const a) {
    int st = 1, dr = n;

    while (st <= dr) {
        int mij = st + (dr - st) / 2;

        const int sum = query(mij);

        if (sum < a) {
            st = mij + 1;
        }
        else if (sum > a) {
            dr = mij - 1;
        }
        else {
            return mij;
        }
    }
}

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

    init();

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

        if (c == 0) {
            int a, b;
            fin >> a >> b;
            update(b, a);
        }
        else if (c == 1) {
            int a, b;
            fin >> a >> b;
            fout << query(b) - query(a - 1) << '\n';
        }
        else {
            int a;
            fin >> a;
            fout << binarySearch(a) << '\n';
        }
    }
}