Cod sursa(job #959688)

Utilizator FlameingoAiordachioaei Marius Flameingo Data 8 iunie 2013 15:01:54
Problema Arbori indexati binar Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.12 kb
#include <cstdio>
using namespace std;

const int DMAX = 100002;
int A[DMAX * 3], a, b, N, s;
short V[DMAX];

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

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

}

void actualizare_arbore () {

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

}

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

    if (a <= l && b >= r) {
        s += A[nod]; return;
    }
    if (r < a || b < l)
        return;
    int m = (l + r) / 2;
    querry_0 (nod * 2, l, m);
    querry_0 (nod * 2 + 1, m + 1, r);

}

int querry_1 () {

    int nod = 1, m = (1 + N) / 2, l = 1, r = N;
    while (l != r) {
        if (s + A[nod * 2] > a)
            nod *= 2, r = m;
        else
            s += A[nod * 2], nod = nod * 2 + 1, l = m + 1;
        m = (l + r) / 2;
    }
    return l;

}

int main() {

    freopen ("aib.in", "r", stdin);
    freopen ("aib.out", "w", stdout);
    int M, i, k;
    scanf ("%d%d", &N, &M);
    for (i = 1; i <= N; ++i)
        scanf ("%d", &V[i]);
    creare_arbore (1, 1, N);
    while (M--) {
        scanf ("%d", &k);
        switch (k) {
            case 0: scanf ("%d%d", &a, &b);
                    actualizare_arbore ();
                    break;
            case 1: scanf ("%d%d", &a, &b);
                    s = 0; querry_0 (1, 1, N);
                    printf ("%d\n", s);
                    break;
            default: scanf ("%d", &a);
                     if (a == A[1]){
                         printf ("%d\n", N); break;
                     }
                     s = 0;
                     b = querry_1 ();
                     if (s == a)
                         printf ("%d\n", b - 1);
                     else
                         printf ("-1\n");
        }
    }
}