Cod sursa(job #2752283)

Utilizator redstonegamer22Andrei Ion redstonegamer22 Data 17 mai 2021 16:05:20
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <bits/stdc++.h>

using namespace std;

#ifndef LOCAL

ifstream in("aib.in");
ofstream out("aib.out");

#define cin in
#define cout out

#endif //LOCAL

#define int int64_t

const int NMAX = 1e5 + 7;
int aib[NMAX];

void update(int ind, int val) {
    for(; ind < NMAX; ind += ind & (-ind)) {
        aib[ind] += val;
    }
}

int query(int ind) {
    int ret = 0;
    for(; ind > 0; ind -= ind & (-ind)) {
        ret += aib[ind];
    }

    return ret;
}

int search(int sum, int n) {
    if(sum == 0) return -1;
    int step = (1 << 16);
    for(int ind = 0; step > 0; step /= 2) {
        if(ind + step <= n && sum >= aib[ind + step])
            ind += step, sum -= aib[ind];
        if(sum == 0) return ind;
    }

    return -1;
}

int32_t main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int n, m; cin >> n >> m;

    for(int i = 1; i <= n; i++) {
        int rd; cin >> rd;
        update(i, rd);
    }

    for(int i = 0; i < m; i++) {
        int op; cin >> op;
        if(op == 0) {
            int a, b; cin >> a >> b;
            update(a, b);
        }
        if(op == 1) {
            int a, b; cin >> a >> b;
            cout << query(b) - query(a - 1) << '\n';
        }
        if(op == 2) {
            int a; cin >> a;
            cout << search(a, n) << '\n';
        }
    }
}