Cod sursa(job #3337733)

Utilizator ankaramessiankaramessi ankaramessi Data 29 ianuarie 2026 17:55:51
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <bits/stdc++.h>

using namespace std;

#define pb push_back
#define ll long long
#define INF 1000000000
#define MOD 666013

const int NMAX = 100005;

int v[NMAX], AIB[NMAX], n;

void Update (int pos, int val) {
    for (int i = pos; i <= n; i += (i & (-i))) AIB[i] += val;
    return;
}

int Query1 (int pos) {
    int val = 0;
    for (int i = pos; i > 0; i -= (i & (-i))) val += AIB[i];
    return val;
}

int Query2 (int val) {
    int i = 0, sum = 0;
    for (int k = (1 << 17); k >= 1; (k = k >> 1)) {
        if (i + k <= n && AIB[i + k] + sum <= val) {
            i += k;
            sum += AIB[i];
        }
    }
    return i;
}

int main() {
    ifstream fin("aib.in");
    ofstream fout("aib.out");
    int q;
    fin >> n >> q;
    for (int i = 1; i <= n; i++) {
        fin >> v[i];
        Update(i, v[i]);
    }

    while (q--) {
        int type;
        fin >> type;
        if (type == 0) {
            int a, b;
            fin >> a >> b;
            Update(a, b);
        }
        else if (type == 1) {
            int a, b;
            fin >> a >> b;
            fout << Query1(b) - Query1(a - 1) << '\n';
        }
        else {
            int x;
            fin >> x;
            int ans = Query2(x);
            if (Query1(ans) == x) fout << ans << '\n';
            else fout << -1 << '\n';
         }
    }
    return 0;
}