Cod sursa(job #3272058)

Utilizator mihaihvhTuburlui Mihai mihaihvh Data 28 ianuarie 2025 11:15:10
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream cin("aib.in");
ofstream cout("aib.out");

#define ll long long

ll n, m, opr;

vector<ll> g;
vector<ll> sum;

int cb(ll val) {
    int st = 1, dr = n;
    while (st <= dr) {
        int mij = (st + dr) / 2;
        if (sum[mij] < val)
            st = mij + 1;
        else if (sum[mij] > val)
            dr = mij - 1;
        else if (sum[mij] == val)
            return mij;
    }
}

int main() {
    cin.tie(0);
    cin.sync_with_stdio(false);
    cin >> n >> m;
    g.resize(n + 1);
    sum.resize(n + 1);

    for (int i = 1; i <= n; ++i)
        cin >> g[i];

    for (int i = 1; i <= n; ++i)
        sum[i] = sum[i - 1] + g[i];

    for (int i = 1; i <= m; ++i) {
        cin >> opr;
        if (opr == 0) {
            int a, b;
            cin >> a >> b;
            g[a] += b;
            for (int j = a; j <= n; ++j)
                sum[j] += b;
        }
        else if (opr == 1) {
            int a, b;
            cin >> a >> b;
            cout << sum[b] - sum[a-1] << '\n';
        }
        else if (opr == 2) {
            int a, k;
            cin >> a;
            /*
            for (int j = 1; j <= n; ++j) {
                if (sum[j] >= a) {
                    k = j;
                    break;
                }
            }
            if (sum[k] != a) cout << -1 << '\n';
            else cout << k << '\n';
            */
            int f = cb(a);
            if (sum[f] == a) cout << f << '\n';
            else cout << -1 << '\n';
        }
    }

    return 0;
}