Cod sursa(job #943286)

Utilizator FlameingoAiordachioaei Marius Flameingo Data 24 aprilie 2013 20:59:51
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
#include <cstdio>

using namespace std;

const int DMAX = 100005;
int B[DMAX * 2], L[DMAX * 2], R[DMAX * 2], V[DMAX], v1, v2, s;

void creare_arbore (int l, int r, int nod) {

    if (l == r) {
        B[nod] = V[l];
        L[nod] = l;
        R[nod] = r;
        return;
    }
    int m = (l + r) / 2;
    creare_arbore (l, m, nod * 2);
    creare_arbore (m + 1, r, nod * 2 + 1);
    B[nod] = B[nod * 2] + B[nod * 2 + 1];
    L[nod] = l;
    R[nod] = r;

}

void actualizare_arbore (int nod) {

    B[nod] += v2;
    if (L[nod] == R[nod])
        return;
    int m = (L[nod] + R[nod]) / 2;
    if (v1 <= m)
        actualizare_arbore (nod * 2);
    else
        actualizare_arbore (nod * 2 + 1);

}

int querry_1 (int nod) {

    if (v1 <= L[nod] && R[nod] <= v2)
        return B[nod];
    if (v2 < L[nod] || v1 > R[nod])
        return 0;
    return querry_1 (nod * 2) + querry_1 (nod * 2 + 1);

}

void querry_2 (int nod) {

    if (s + B[nod * 2] > v1)
        querry_2 (nod * 2);
    else
        if (s + B[nod * 2] == v1) {
            v2 = R[nod * 2]; return;
        }
        else
            if (s + B[nod * 2] + B[nod * 2 + 1] > v1)
                querry_2 (nod * 2 + 1);
            else {
                v2 = R[nod * 2 + 1]; return;
            }


}

int main () {

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

    int N, Q, i, p;

    scanf ("%d%d", &N, &Q);
    for (i = 1; i <= N; ++i)
        scanf ("%d", &V[i]);
    creare_arbore (1, N, 1);
    while (Q--) {
        scanf ("%d", &p);
        switch (p) {
        case 0: scanf ("%d%d", &v1, &v2); actualizare_arbore (1); break;
        case 1: scanf ("%d%d", &v1, &v2); printf ("%d\n", querry_1 (1)); break;
        default: scanf ("%d", &v1); s = 0; v2 = 0; querry_2 (1);
        if (v2)
            printf ("%d\n", v2);
        else
            printf ("-1\n");
        }
    }

}