Cod sursa(job #3357364)

Utilizator VladPislaruPislaru Vlad Rares VladPislaru Data 9 iunie 2026 09:35:05
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.88 kb
#include <cstdio>
using namespace std;

const int MAXN = 100005;
int n, m, A[MAXN], tree[4 * MAXN];

void build(int node, int start, int end) {
    if (start == end)
        tree[node] = A[start];
    else {
        int mid = (start + end) / 2;
        build(2 * node, start, mid);
        build(2 * node + 1, mid + 1, end);
        tree[node] = tree[2 * node] + tree[2 * node + 1];
    }
}

void update(int node, int start, int end, int idx, int val) {
    if (start == end)
        tree[node] += val;
    else {
        int mid = (start + end) / 2;
        if (idx <= mid)
            update(2 * node, start, mid, idx, val);
        else
            update(2 * node + 1, mid + 1, end, idx, val);
        tree[node] = tree[2 * node] + tree[2 * node + 1];
    }
}

int query(int node, int start, int end, int l, int r) {
    if (r < start || end < l)
        return 0;
    if (l <= start && end <= r)
        return tree[node];
    int mid = (start + end) / 2;
    return query(2 * node, start, mid, l, r) + query(2 * node + 1, mid + 1, end, l, r);
}

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

    scanf("%d %d", &n, &m);
    for (int i = 0; i < n; ++i)
        scanf("%d", &A[i]);

    build(1, 0, n - 1);

    for (int i = 0; i < m; ++i) {
        int op;
        scanf("%d", &op);
        if (op == 0) {
            int a, b;
            scanf("%d %d", &a, &b);
            update(1, 0, n - 1, a - 1, b);
        } else if (op == 1) {
            int a, b;
            scanf("%d %d", &a, &b);
            printf("%d\n", query(1, 0, n - 1, a - 1, b - 1));
        } else {
            int a;
            scanf("%d", &a);
            int sum = 0, pos = -1;
            for (int j = 0; j < n && sum <= a; ++j) {
                sum += A[j];
                if (sum == a)
                    pos = j + 1;
            }
            printf("%d\n", pos);
        }
    }

    return 0;
}