Cod sursa(job #1413953)

Utilizator BaTDucKMocanu George BaTDucK Data 2 aprilie 2015 11:19:04
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include<bits/stdc++.h>

#define Nmax 100005

using namespace std;

int N, M, Arb[Nmax], val;

void Uptade(int Poz, int val)
{
    int C = 0;

    while(Poz <= N) {
        Arb[Poz] += val;
        while(!(Poz & (1 << C)))
            ++ C;
        Poz += (1 << C);
    }
}

int Query(int Dr)
{
    int C = 0, Answer = 0;

    while(Dr) {
        Answer += Arb[Dr];
        while(!(Dr & (1 << C)))
            ++ C;
        Dr -= (1 << C);
    }

    return Answer;
}

int Search(int Val)
{
    int step, i;

    for(step = 1; step <= N; step <<= 1);

    for(i = 1; step; step >>= 1)
        if(i + step <= N && Query(i + step) <= Val)
            i += step;

    if(Query(i) == Val)
        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; Uptade(i, val), ++ i)
        scanf("%d", &val);


    for( ; M; -- M) {
        int tip, A, B;
        scanf("%d", &tip);
        if(tip == 0) {
            scanf("%d %d", &A, &B);
            Uptade(A, B);
            continue;
        }

        if(tip == 1) {
            scanf("%d %d", &A, &B);
            printf("%d\n", Query(B) - Query(A - 1));
            continue;
        }

        if(tip == 2) {
            scanf("%d", &A);
            printf("%d\n", Search(A));
        }
    }

    return 0;
}