Cod sursa(job #3311115)

Utilizator filip.ripaRipa Filip filip.ripa Data 19 septembrie 2025 16:45:44
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <bits/stdc++.h>
using namespace std;

int lsb(int x) {
    return x & (-x);
}

struct AIB {
    vector<int> a;
    int n;

    AIB(int M) {
        n = M;
        a.resize(n);
    }

    void update(int p, int val) {
        if(p > n)
            return;
        a[p - 1] += val;
        update(p + lsb(p), val);
    }

    int sp(int p) {
        if(p == 0)
            return 0;
        return a[p - 1] + sp(p - lsb(p));
    }

    int op2(int x) {
        int st = 1, dr = n;
        while(st <= dr) {
            int mj = (st + dr) / 2;
            int rez = sp(mj);
            if(rez < x) {
                st = mj + 1;
            } else if(rez > x) {
                dr = mj - 1;
            } else {
                return mj;
            }
        }
        return -1;
    }

    int query(int x, int y) {
        return sp(y) - sp(x - 1);
    }
};

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

    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m; cin >> n >> m;

    AIB aib(n);

    for(int i = 0; i < n; i ++) {
        int x; cin >> x;
        aib.update(i + 1, x);
    }
    for(int i = 0; i < m; i ++) {
        int cer; cin >> cer;
        if(cer == 0) {
            int x, y; cin >> x >> y;
            aib.update(x, y);
        } else if(cer == 1) {
            int x, y; cin >> x >> y;
            cout << aib.query(x, y) << '\n';
        } else {
            int x; cin >> x;
            cout << aib.op2(x) << '\n';
        }
    }
}