Cod sursa(job #1493193)

Utilizator andreea_zahariaAndreea Zaharia andreea_zaharia Data 28 septembrie 2015 20:40:44
Problema Arbori indexati binar Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <cstdio>

using namespace std;

#define NMAX 100010

int aib[NMAX];
int N, M;
int v[NMAX];

void update (int poz, int val) {
    for (int i = poz; i <= N; i += (i^(i&(i-1)))) {
        aib[i] += val;
    }
}

int query (int poz) {
    int ans = 0; // suma de la 1 la poz
    for (int i = poz; i > 0; i -= (i^(i&(i-1)))) {
        ans += aib[i];
    }
    return ans;
}

int binSearch (int sum) {
    int i, pas = 1<<17;
    for (i = 0; pas > 0; pas>>=1) {
        if (i + pas <= N) {
            if (sum >= aib[i + pas]) {
                i += pas;
                sum -= aib[i];

                if (sum == 0) {
                    return i;
                }
            }
        }
    }
    return -1;
}

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

    scanf ("%d%d", &N, &M);
    for (int i = 1; i <= N; i++) {
        scanf ("%d", &v[i]);
        update (i, v[i]);
    }

    int tip, X, Y;
    while (M--) {
        scanf ("%d", &tip);

        if (tip == 0) {
            scanf ("%d%d", &X, &Y);
            update (X, Y);
        }
        else {
            if (tip == 1) {
                scanf ("%d%d", &X, &Y);
                printf ("%d\n", query (Y) - query (X - 1));
            }
            else {
                scanf ("%d", &X);
                printf ("%d\n", binSearch (X));
            }
        }
    }

    return 0;
}