Cod sursa(job #3364032)

Utilizator filipdanieloanFilip-Daniel Oancea filipdanieloan Data 27 august 2026 14:55:52
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.43 kb
#include <bits/stdc++.h>
using namespace std;

int n;

struct SegTree {
    vector<long long> aint;
    SegTree(vector<int>& v) {
        aint.resize(4 * v.size() + 1);
        build(v);
    }

    long long query(vector<int>& v, int x, int y, int i = 1, int j = n, int idx = 1) {
        if (i == x && j == y) {
            return aint[idx];
        }
        int mid = i + (j - i) / 2;
        if (y <= mid) {
            return query(v, x, y, i, mid, 2 * idx);
        }
        if (x > mid) {
            return query(v, x, y, mid + 1, j, 2 * idx + 1);
        }
        return query(v, x, mid, i, mid, 2 * idx) +
               query(v, mid + 1, y, mid + 1, j, 2 * idx + 1);
    }

    void update(vector<int>& v, int x, int y, int i = 1, int j = n, int idx = 1) {
        if (i == j && j == x) {
            aint[idx] = y;
            v[i] = y;
            return;
        }
        int mid = i + (j - i) / 2;
        if (x <= mid) {
            update(v, x, y, i, mid, 2 * idx);
        } else {
            update(v, x, y, mid + 1, j, 2 * idx + 1);
        }
        aint[idx] = aint[2 * idx] + aint[2 * idx + 1];
    }

private:
    void build(vector<int>& v, int i = 1, int j = n, int idx = 1) {
        if (i == j) {
            aint[idx] = v[i];
            return;
        }
        int mid = i + (j - i) / 2;
        build(v, i, mid, 2 * idx);
        build(v, mid + 1, j, 2 * idx + 1);
        aint[idx] = aint[2 * idx] + aint[2 * idx + 1];
    }
};

signed main() {
#ifndef LOCAL
    cin.tie(nullptr)->sync_with_stdio(false);
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);
#endif

    int m; cin >> n >> m;
    vector<int> v(n + 1);
    for (int i = 1; i <= n; ++i) {
        cin >> v[i];
    }

    SegTree aint(v);

    while (m--) {
        int op, x, y; cin >> op >> x;
        if (op < 2)
            cin >> y;
        if (op == 0)
            aint.update(v, x, v[x] + y);
        else if (op == 1)
            cout << aint.query(v, x, y) << '\n';
        else {
            int ans = -1, l = 1, r = n;
            while (l <= r) {
                int mid = l + (r - l) / 2;
                if (aint.query(v, 1, mid) == x) {
                    ans = mid;
                    break;
                }
                if (aint.query(v, 1, mid) < x) {
                    l = mid + 1;
                } else {
                    r = mid - 1;
                }
            }
            cout << ans << '\n';
        }
    }



    return 0;
}