Cod sursa(job #2468624)

Utilizator Leonard1998Olariu Leonard Leonard1998 Data 5 octombrie 2019 18:22:54
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <bits/stdc++.h>
#define N (int) (1e5+5)

using namespace std;

int n, m, op, a, b;
int aib[N];

void update(int pos, int add) {
    for (int i = pos; i <= n; i += i&(-i))
        aib[i] += add;
}

int query(int pos) {
    int ret = 0;
    for (int i = pos; i >= 1; i -= i&(-i))
        ret += aib[i];

    return ret;
}

int query2(int l, int r) {
    return query(r) - query(l-1);
}

int binarySearch(int left, int right, int val) {
    if (left > right) return -1;

    int mid = (left + right) / 2;
    int sum1mid = query(mid);

    if (sum1mid == val) {
        int leftBest = binarySearch(left, mid-1, val);

        if (leftBest == -1) return mid;
        return leftBest;
    }

    if (sum1mid > val) return binarySearch(left, mid-1, val);
    else return binarySearch(mid+1, right, val);
}

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

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

    for (int i = 1; i <= m; ++i) {
        scanf("%d", &op);

        if (op == 0) {
            scanf("%d %d", &a, &b);
            update(a, b);
        } else if (op == 1) {
            scanf("%d %d", &a, &b);
            printf("%d\n", query2(a, b));
        } else {
            scanf("%d", &a);
            printf("%d\n", binarySearch(1, n, a));
        }
    }

    return 0;
}