Cod sursa(job #1763104)

Utilizator enacheionutEnache Ionut enacheionut Data 24 septembrie 2016 12:06:20
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <stdio.h>
#include <math.h>
#include <vector>

using namespace std;

vector<int> binaryIndexedTree(20000, 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 )
    {
        int item;
        scanf("%d", &item);
        UpdateBinaryIndexedTree(item, 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;
}

void ProcessQueries()
{
    int queryType;
    while( numberOfQueris-- )
    {
        scanf("%d", &queryType);
        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);

    BuildBinaryIndexedTree();

    ProcessQueries();

    return 0;
}