Cod sursa(job #892920)

Utilizator visanrVisan Radu visanr Data 26 februarie 2013 12:14:58
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;

#define Nmax 100010

int Aib[Nmax], N, M, X, Y, Type;

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 Query(int Pos)
{
    int Ans = 0;
    for(; Pos; Pos -= LSB(Pos))
        Ans += Aib[Pos];
    return Ans;
}

int QueryType2(int Lim)
{
    if(Lim == 0) return -1;
    int Step = 1, Pos = 0;
    for(; Step * 2 <= N; Step *= 2);
    for(; Step; Step >>= 1)
        if(Pos + Step <= N && Aib[Pos + Step] <= Lim)
            Lim -= Aib[Pos + Step], Pos += Step;
    if(Lim) return -1;
    else return Pos;
}

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