Cod sursa(job #2734296)

Utilizator Leonard123Mirt Leonard Leonard123 Data 31 martie 2021 17:49:37
Problema Arbori indexati binar Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include<fstream>
using namespace std;

const int N = 4e5 + 5; 
int arb[N], n, x, y, o, q, sum;

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

void update (int nod, int st, int dr) {
    if (st == dr) {
        arb[nod] += y; 
        return;
    }
    int mid = (st + dr) / 2;
    if (x <= mid)
        update(2 * nod, st, mid);
    else 
        update(2 * nod + 1, mid + 1, dr);
    arb[nod] = arb[2 * nod] + arb[2 * nod + 1];
}

void query (int nod, int st, int dr) {
    if (st >= x && y >= dr) {
        sum += arb[nod];
        return;
    }
    int mid = (st + dr) / 2;
    if (x <= mid) 
        query(2 * nod, st, mid); 
    if (y > mid) 
        query(2 * nod + 1, mid + 1, dr);
}

int main() {
    cin >> n >> q;
    for (x = 1; x <= n; x++) {
        cin >> y;
        update(1, 1, n);
    }
    while (q--) {
        cin >> o;
        if (o < 2) {
            cin >> x >> y;
            if (o) {
                sum = 0; 
                query(1, 1, n);
                cout << sum << "\n";
            } else 
                update(1, 1, n);
        } else {
            x = 1; 
            int what;
            cin >> what;
            int st = 1, dr = n;
            while (st <= dr) {
                sum = 0;
                y = (st + dr) / 2;
                query(1, 1, n);
                if (sum >= what)
                    dr = y - 1;
                else 
                    st = y + 1;
            }
            sum = 0; 
            y = dr + 1;
            query(1, 1, n);
            if (sum == what)
                cout << y << "\n";
            else 
                cout << "-1\n";
        }
    }
}