Cod sursa(job #842424)

Utilizator visanrVisan Radu visanr Data 26 decembrie 2012 20:34:51
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <cstdio>
#include <cstdlib>
using namespace std;

#define nmax 100010

int AIB[nmax], N, M, T, A, B;

int LSB(int X)
{
    return ((X & (X - 1)) ^ X);
}

void Update(int Pos, int Val)
{
    for(; Pos <= N; Pos += LSB(Pos))
        AIB[Pos] += Val;
}

int QuerySum(int Pos)
{
    int Sum = 0;
    for(; Pos; Pos -= LSB(Pos))
        Sum += AIB[Pos];
    return Sum;
}

int QueryPos(int Val)
{
    int Step = 1, Pos = 0;
    for(; (2 * Step) <= N; Step *= 2);
    for(; Step; Step /= 2)
        if(Pos + Step <= N && AIB[Pos + Step - 1] <= Val)
            Val -= AIB[Pos + Step - 1], Pos += Step;
    if(Val) return -1;
    else return Pos;
}

int main()
{
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);
    scanf("%i %i", &N, &M);
    for(int i = 1; i <= N; i++)
    {
        int X;
        scanf("%i", &X);
        Update(i, X);
    }
    for(int i = 1; i <= M; i++)
    {
        scanf("%i", &T);
        if(T < 2)
        {
            scanf("%i %i", &A, &B);
            if(T == 0) Update(A, B);
            else printf("%i\n", QuerySum(B) - QuerySum(A - 1));
        }else
        {
            scanf("%i", &A);
            printf("%i\n", QueryPos(A));
        }
    }
    return 0;
}