Cod sursa(job #3036979)

Utilizator SmauSmau George Robert Smau Data 25 martie 2023 11:53:26
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <bits/stdc++.h>

#define NMAX 100008

using namespace std;

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

int BIT[NMAX];
int n, Q;

void Update(int pos, int value) {
    for(int i = pos; i <= n; i += i & (-i))
        BIT[i] += value;
}

int Query(int pos) {
    int ans = 0;
    for(int i = pos; i > 0; i -= i & (-i))
        ans += BIT[i];

    return ans;
}

int BySearch(int value) {
    int left = 0, right = n + 1;

    while(right - left > 1) {
        int mid = (left + right) / 2;
        if(Query(mid) > value) right = mid;
        else left = mid;
    }

    if(Query(left) == value) return left;
    return -1;
}

int main() {
    fin >> n >> Q;
    for(int i = 1; i <= n; i ++) {
        int x; fin >> x;
        Update(i, x);
    }

    for(int i = 1; i <= Q; i ++) {
        int task; fin >> task;
        if(task == 0) {
            int a, b; fin >> a >> b;
            Update(a, b);
            continue;
        }

        if(task == 1) {
            int a, b; fin >> a >> b;
            fout << Query(b) - Query(a - 1) << '\n';
            continue;
        }

        int a; fin >> a;
        fout << BySearch(a) << '\n';
    }

    return 0;
}