Cod sursa(job #1761512)

Utilizator enacheionutEnache Ionut enacheionut Data 22 septembrie 2016 13:34:15
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.2 kb
#include <stdio.h>
#include <math.h>
#include <vector>

using namespace std;

vector<int> binaryIndexedTree(100005, 0);
vector<int> items(100005, 0);
int numberOfItems;
int numberOfQueris;

int GetNext(int index)
{
    return index + (index & -index);
}

void UpdateBinaryIndexedTree(int value, int index)
{
    while( index <= numberOfItems )
    {
        binaryIndexedTree[index] += value;
        index = GetNext(index);
    }
}

void BuildBinaryIndexedTree()
{
    for( int i = 1; i<=numberOfItems; ++i )
    {
        UpdateBinaryIndexedTree(items[i-1], i);
    }
}

int GetParent(int index)
{
    return index - (index & -index);
}

int GetSum( int index )
{
    int sum = 0;

    while( index > 0 )
    {
        sum += binaryIndexedTree[index];
        index = GetParent(index);
    }
    return sum;
}

int Search(int value)
{
    int index = 0;
    int step = pow(2, numberOfItems);
    while( step >>= 1 )
    {
        if( index + step <= numberOfItems &&
           value >= binaryIndexedTree[index + step] )
        {
            index += step;
            value -= binaryIndexedTree[index];
            if( !value )
            {
                return index;
            }
        }
    }
    return -1;
}

void ProcessQueries()
{
    int queryType;
    while( numberOfQueris-- )
    {
        scanf("%d", &queryType);
        if( queryType == 2 )
        {
            int value;
            scanf("%d", &value);
            printf("%d\n", Search(value));
        }
        else
        {
            int aux1;
            int aux2;
            scanf("%d%d", &aux1, &aux2);

            if (queryType == 0)
            {
                UpdateBinaryIndexedTree(aux2, aux1);
            }
            else
            {
                printf( "%d\n", GetSum(aux2) - GetSum(aux1 - 1 ));
            }
        }
    }
}

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

    scanf("%d%d", &numberOfItems, &numberOfQueris);

    for( int i = 0; i<numberOfItems; ++i )
    {
        scanf("%d", &items[i]);
    }

    BuildBinaryIndexedTree();

    ProcessQueries();

    return 0;
}