Cod sursa(job #1248294)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 24 octombrie 2014 21:24:00
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <cstdio>

using namespace std;

const int Max = 100001;
int AIB[Max], N;

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

void Update(int Pos, int Val)
{
    /// Update element on position Pos with Val.
    for(; Pos <= N; Pos += LSB(Pos))
        AIB[Pos] += Val;
}

int Query(int Pos)
{
    /// Returns sum of elements 1, 2, ... , n.
    int Sum = 0;
    for(; Pos; Pos -= LSB(Pos))
        Sum += AIB[Pos];
    return Sum;
}

int Search(int K)
{
    int Begin = 1, End = N, Middle, LF=-1, Aux;
    while(Begin <= End)
    {
        Middle = (Begin+End)>>1;
        Aux = Query(Middle);
        if(Aux < K) Begin = Middle+1;
        if(Aux > K) End = Middle-1;
        if(Aux == K)
        {
            End = Middle-1;
            LF = Middle;
        }
    }
    return LF;
}

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

    int M, i, Type, A, B;

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