Cod sursa(job #2627714)

Utilizator CosminMorarMorar Cosmin Andrei CosminMorar Data 12 iunie 2020 08:59:30
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>
#define LAST_ONE_BIT ((poz ^ (poz - 1)) & poz)
using namespace std;
using ll = long long;
ifstream fin("aib.in");
ofstream fout("aib.out");
int n, m, aib[100100], c, a, b;

void update(int poz, int change) {
    for (; poz <= n; poz += LAST_ONE_BIT)
        aib[poz] += change;
}

int query(int poz) {
    if (poz == 0)
        return 0;
    return aib[poz] + query(poz - LAST_ONE_BIT);
}

int bin_search(int want_sum) { /// cautarea binara a lui Patrascu
    ll pas = 1;
    for (; pas < n; pas <<= 1);

    int poz = 0;
    for (; pas; pas >>= 1)
        if (poz + pas <= n)
            if (aib[poz + pas] <= want_sum) {
                poz += pas;
                want_sum -= aib[poz];
            }

    if (poz == 0 || want_sum != 0)
        return -1;
    return poz;
}

int main() {
    fin >> n >> m;
    for (int i = 1; i <= n; i++) {
        fin >> a;
        update(i, a);
    }

    for (int i = 1; i <= m; i++) {
        fin >> c;
        if (c == 0) {
            fin >> a >> b;
            update(a, b);
        } else if (c == 1) {
            fin >> a >> b;
            fout << query(b) - query(a - 1) << '\n';
        } else {
            fin >> a;
            fout << bin_search(a) << '\n';
        }
    }
    return 0;
}