Cod sursa(job #2762611)

Utilizator vara2021vara 2021 vara2021 Data 8 iulie 2021 19:30:54
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;

int n, m;
int aib[100100];

void update(int pos, int val) {
    while (pos <= n) {
        aib[pos] += val;
        pos += pos & -pos;
    }
}

int query(int pos) {
    int sum = 0;
    while (pos > 0) {
        sum += aib[pos];
        pos -= pos & -pos;
    }
    return sum;
}

int cautbin(int val) {
    int l = 1, r = n, m;
    while (l < r) {
        m = (l + r) / 2;
        int sum = query(m);
        if (sum == val) return m;
        if (sum < val) l = m+1; else r = m-1;
    }
    return query(l) == val ? l : -1;
}

int main() {
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);

    int op, pos, val, left, right;

    scanf("%d %d", &n, &m);
    for (int i = 1; i <= n; ++i) {
        scanf("%d", &val);
        update(i, val);
    }

    for (int i = 1; i <= m; ++i) {
        scanf("%d", &op);
        if (op == 0) {
            scanf("%d %d", &pos, &val);
            update(pos, val);
        } else if (op == 1) {
            scanf("%d %d", &left, &right);
            printf("%d\n", query(right) - query(left-1));
        } else {
            scanf("%d", &val);
            printf("%d\n", cautbin(val));
        }
    }
    return 0;
}