Cod sursa(job #964537)

Utilizator FlameingoAiordachioaei Marius Flameingo Data 21 iunie 2013 13:10:14
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <cstdio>

const int DMAX = 100003;
int N, A[DMAX], a, b;

void update_aib (int i) {

    while (i <= N)
        A[i] += b,
        i += i & (-i);

}

int subseq_1n (int i) {

    int s = 0;
    while (i)
        s += A[i],
        i -= i & (-i);
    return s;

}

int querry_02 () {

    int i = 0, s = 0;
    while (s < a) {
        ++i;
        while (i + (i & (-i)) <= N && s + A[i + (i & (-i))] <= a)
            i += i & (-i);
        s += A[i];
    }
    if (s == a)
        return i;
    else
        return -1;
}

int main () {

    freopen ("aib.in", "r", stdin);
    freopen ("aib.out", "w", stdout);
    int M, i;
    scanf ("%d%d", &N, &M);
    for (i = 1; i <= N; ++i)
        scanf ("%d", &b), update_aib (i);
    while (M--) {
        scanf ("%d", &i);
        switch (i) {
        case 0:
            scanf ("%d%d", &a, &b);
            update_aib(a);
            break;
        case 1:
            scanf ("%d%d", &a, &b);
            printf ("%d\n", subseq_1n(b) - subseq_1n(a - 1));
            break;
        default:
            scanf ("%d", &a);
            printf ("%d\n", querry_02 ());
        }
    }

}