Cod sursa(job #2127492)

Utilizator TudorVersoiuVersoiu Tudor Sorin TudorVersoiu Data 10 februarie 2018 18:14:58
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream f("aib.in" );
ofstream g("aib.out");

int BIT[100005], N, M, v[100005];

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

    while (index>0)
    {
        sum += BIT[index];
        index -= index & (-index);
    }
    return sum;
}

void updateBIT(int BITree[], int n, int index, int val)
{
    while (index <= n)
    {
       BITree[index] += val;
       index += index & (-index);
    }
}

void InitBITree(int v[], int N ,int BITree[]) {
    for ( int i=1; i<=N; i++ )
        updateBIT(BITree, N, i, v[i]);
}

int CautareBinara(int first, int last, int x)
{
    int m = (first + last)/2;
    int act = getSum(m);
    if ( first == last ) return first;

    if ( x <= act )
        return CautareBinara(first, m, x);
    else
        return CautareBinara(m+1, last, x);
}

int Problem3(int x)
{
    int pos = CautareBinara(1, N, x);
    if ( getSum(pos) == x ) return pos;
    else return -1;
}

int main()
{
    f >> N >> M;
    for ( int i=1; i<=N; i++ )
        f >> v[i];

    InitBITree(v, N, BIT);

    int OpType, a, b;
    for ( int i=1; i<=M; i++ )
    {
        f >> OpType >> a;
        if ( OpType < 2 ) f >> b;

        if ( OpType == 0 ) updateBIT(BIT, N, a, b);
        if ( OpType == 1 ) g << getSum(b) - getSum(a-1) << '\n';
        if ( OpType == 2 ) g << Problem3(a) << '\n';
    }
}