Cod sursa(job #1417780)

Utilizator silvia_the_bestSilvia Pripoae silvia_the_best Data 10 aprilie 2015 22:50:52
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <cstdio>
#include <cstring>

#define MAXN 100001

void update(int *AIB, int M, int index, int value) 
{
    for (; index <= M; index += index & (-index))
        AIB[index] += value;
}


int query(int *AIB, int index) 
{
    int R, i;

    for (R = 0, i = index; i > 0; i -= i & (-i))
        R += AIB[i];

    return R;
}

int bsearch(int *AIB, int start, int M, int maxStep, int value) 
{
    int step, i, R = 0;
    
    for (i = 0, step = maxStep; step; step >>= 1) 
        if (i + step <= M && AIB[i + step] <= value) {
            i += step;
            value -= AIB[i];            

            if (!value)
                return i;
        } 

    return value ? -1 : i;
}

int searchBruteforce(int *AIB, int M, int value) 
{
    int i;

    for (i = 1; i <= M; ++ i)
        if (query(AIB, i) == value)
            return i - 1;

    return -1;
}

int main() 
{
    int N, M, maxStep;
    int AIB[MAXN];
    int type, x, y, step, i;

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

    memset(AIB, 0, sizeof(AIB));
    scanf("%d %d\n", &M, &N);

    for (i = 1; i <= M; ++ i) {
        scanf("%d", &x);
        update(AIB, M, i, x);
    }

    for (maxStep = 1; maxStep < M; maxStep <<= 1);

    for (; N; -- N) {
        scanf("%d %d", &type, &x);

        switch (type) {
            case 0:
                scanf("%d", &y);
                update(AIB, M, x, y);
                break;
            case 1:
                scanf("%d", &y);
                printf("%d\n", query(AIB, y) - query(AIB, x - 1));
                break;
            case 2:
                printf("%d\n", bsearch(AIB, 1, M, maxStep, x));
                break;
            default:
                break;
        }
    }
}