Cod sursa(job #944129)

Utilizator FlameingoAiordachioaei Marius Flameingo Data 27 aprilie 2013 15:11:51
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#include <cstdio>

const int DMAX = 200006;
short A[DMAX], V[DMAX / 2];
int x, y, S;

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

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

}

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

    int m;
    while (l != r) {
        A[nod] += y;
        m = (l + r) / 2;
        if (x <= m)
            r = m, nod *= 2;
        else
            l = m + 1, nod = nod * 2 + 1;
    }

}

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

    if (x <= l && y >= r) {
        S += A[nod];
        return;
    }
    if (l > y || r < x)
        return;
    int m = (l + r) / 2;
    querry_01 (l, m, nod * 2);
    querry_01 (m + 1, r, nod * 2 + 1);

}

int querry_02 (int l, int r, int nod) {

    while (l != r) {
        if (S == x)
            return r;
        if (A[nod * 2] + S > x)
            r = (l + r) / 2, nod *= 2;
        else
            S += A[nod * 2], l = (l + r) / 2 + 1, nod = nod * 2 + 1;
    }
    if (S == x)
        return r;
    return 0;

}

int main () {

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

    int N, Q, i;
    scanf ("%d%d", &N, &Q);
    for (i = 1; i <= N; ++i)
        scanf ("%d", &V[i]);
    creare_arbore (1, N, 1);
    while (Q--) {
        scanf ("%d", &i);
        switch (i) {
        case 0:
            scanf ("%d%d", &x, &y);
            actualizare_arbore (1, N, 1);
            break;
        case 1:
            scanf ("%d%d", &x, &y);
            S = 0;
            querry_01 (1, N, 1);
            printf ("%d\n", S);
            break;
        default:
            scanf ("%d", &x);
            S = 0;
            printf ("%d\n", querry_02 (1, N, 1) - 1);
        }
    }

}