Cod sursa(job #3357964)

Utilizator TestLicenta123Test Test TestLicenta123 Data 13 iunie 2026 22:20:09
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.89 kb
#include <cstdio>
#include <vector>
using namespace std;

const int MAXN = 100005;

int n, m;
int aib[MAXN];
vector<int> v;

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

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

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

int find_pos(int sum) {
    int pos = 0;
    int bitmask = 1;
    while (bitmask < n) bitmask <<= 1;
    for (; bitmask; bitmask >>= 1) {
        int next_pos = pos + bitmask;
        if (next_pos <= n && aib[next_pos] < sum) {
            sum -= aib[next_pos];
            pos = next_pos;
        }
    }
    return pos + 1;
}

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

    scanf("%d %d", &n, &m);
    v.resize(n + 1);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &v[i]);
        update(i, v[i]);
    }

    while (m--) {
        int op;
        scanf("%d", &op);
        if (op == 0) {
            int a, b;
            scanf("%d %d", &a, &b);
            update(a, b);
            v[a] += b;
        } else if (op == 1) {
            int a, b;
            scanf("%d %d", &a, &b);
            printf("%d\n", query_range(a, b));
        } else if (op == 2) {
            int a;
            scanf("%d", &a);
            int low = 1, high = n, ans = -1;
            while (low <= high) {
                int mid = (low + high) / 2;
                int s = query(mid);
                if (s == a) {
                    ans = mid;
                    high = mid - 1;
                } else if (s < a) {
                    low = mid + 1;
                } else {
                    high = mid - 1;
                }
            }
            printf("%d\n", ans);
        }
    }

    fclose(stdin);
    fclose(stdout);
    return 0;
}