Cod sursa(job #1118994)

Utilizator visanrVisan Radu visanr Data 24 februarie 2014 14:18:39
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <cstdio>
using namespace std;

const int NMAX = 100010;

int N, M, V[NMAX], Aib[NMAX], Type, 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 Ask(int Pos)
{
    int Now = 0;
    for(; Pos; Pos -= LSB(Pos))
        Now += Aib[Pos];
    return Now;
}

int Query(int Sum)
{
    if(!Sum) return -1;
    int Pos, Step;
    for(Pos = 0, Step = (1 << 20); Step; Step /= 2)
        if(Pos + Step <= N && Aib[Pos + Step] <= Sum)
            Sum -= Aib[Pos + Step], Pos += Step;
    if(Sum > 0) return -1;
    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) scanf("%i", &V[i]), Update(i, V[i]);

    for(; M; M --)
    {
        scanf("%i", &Type);
        if(Type == 2)
        {
            scanf("%i", &A);
            printf("%i\n", Query(A));
        }else
        {
            scanf("%i %i", &A, &B);
            if(Type == 0) Update(A, B);
            else printf("%i\n", Ask(B) - Ask(A - 1));
        }
    }
}