Cod sursa(job #3321099)

Utilizator NeamtuMateiNeamtu Matei-Constantin NeamtuMatei Data 8 noiembrie 2025 10:48:26
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <iostream>
#include <fstream>
using namespace std;

#define in fin
#define out fout
#define lsb(x) (x & (-x))
ifstream fin("aib.in");
ofstream fout("aib.out");

const int MAXN = 1e5;
const int MAXM = 15e4;

int op, n, m, a, b, x;
int aib[MAXN+2];

void add(int poz, int val) {
    for (int i = poz; i <= n; i += lsb(i))
        aib[i] += val;
}

int suma(int poz) {
    int rez = 0;
    for (int i = poz; i >= 1; i -= lsb(i))
        rez += aib[i];

    return rez;
}

int query_suma(int st, int dr) {
    return suma(dr) - suma(st - 1);
}

int cbin(int st, int dr, int val) {
    int poz = -1;

    while (st <= dr) {
        int mid = (st + dr) / 2;
        int sumMid = query_suma(1, mid);

        if (sumMid == val)
            poz = mid;

        if (sumMid >= val)
            dr = mid - 1;
        else
            st = mid + 1;
    }

    return poz;
}

int main() {
    in >> n >> m;
    for (int i = 1; i <= n; i++)
        in >> x,
        add(i, x);

    for (int i = 1; i <= m; i++) {
        in >> op;

        if (op == 0) {
            in >> a >> b;
            add(a, b);
        }

        else if (op == 1) {
            in >> a >> b;
            out << query_suma(a, b) << '\n';
        }

        else {
            in >> a;
            out << cbin(1, n, a) << '\n';
        }
    }

    return 0;
}