Cod sursa(job #2800734)

Utilizator UnknownPercentageBuca Mihnea-Vicentiu UnknownPercentage Data 13 noiembrie 2021 20:45:58
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <bits/stdc++.h>

using namespace std;

inline void Open(const string Name) {
    #ifndef ONLINE_JUDGE
        (void)!freopen((Name + ".in").c_str(), "r", stdin);
        (void)!freopen((Name + ".out").c_str(), "w", stdout);
    #endif
}

int bit[100001];
int N, M;

void add(int idx, int plus) {
    for(;idx <= N;idx += idx & -idx)
        bit[idx] += plus;
}

int sum(int idx) {
    int res = 0;
    for(;idx > 0;idx -= idx & -idx)
        res += bit[idx];

    return res;
}

int Query(int L, int R) {
    return sum(R) - sum(L - 1); 
}

int Find(int x) {
    int y = 0;
    for(int k = (1 << 17);k >= 1;k >>= 1) {
        if(y + k < N && bit[y + k] < x)
            x -= bit[y + k], y += k;
    }

    return y + 1;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    Open("aib");

    cin >> N >> M;
    for(int i = 1, plus;i <= N;i++)
        cin >> plus, add(i, plus);

    while(M--) {
        int T, a, b;
        cin >> T;
        if(T == 0)
            cin >> a >> b, add(a, b);
        if(T == 1)
            cin >> a >> b, cout << Query(a, b) << "\n";
        if(T == 2) {
            cin >> a;
            int ans = Find(a);
            cout << ((sum(ans) == a)? ans : -1) << "\n";
        }
    }

    return 0;
}