Cod sursa(job #1423291)

Utilizator DysKodeTurturica Razvan DysKode Data 21 aprilie 2015 17:49:33
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.13 kb
#include <fstream>

using namespace std;

ifstream fin("aib.in");
ofstream fout("aib.out");

#define DIM 200010

int Arb[ DIM ],i,j,n,m,val,pos,q,ans,suma,in,sf;

void FuncUpdate(int nod, int left, int right)
{
    if( left == right )
    {
        Arb[ nod ] += val;
        return;
    }

    int middle = ( left + right ) / 2;

    if( pos <= middle )
        FuncUpdate( 2 * nod , left , middle );
    else
        FuncUpdate( 2 * nod + 1 , middle + 1 , right );

    Arb[ nod ] = Arb[ 2 * nod ] + Arb[ 2 * nod + 1 ];
}

void FuncSolve1(int nod, int left, int right)
{
    if( left >= in && right <= sf )
    {
        ans += Arb[ nod ];
        return;
    }

    if( left > sf || right < in )
        return;

    int middle = ( left + right ) / 2;

    FuncSolve1( 2 * nod , left , middle );
    FuncSolve1( 2 * nod + 1 , middle + 1 , right );
}

void FuncSolve2(int nod, int left, int right, int sum)
{
    if( sum == 0 )
    {
        ans = left - 1;
        return;
    }

    if( sum < 0 )
    {
        ans = -1;
        return;
    }

    if( left == right )
    {
        if( Arb[ nod ] == sum )
            ans = left;
        else
            ans = -1;
        return;
    }

    int middle = ( left + right ) / 2;

    if( Arb[ 2 * nod ] <= sum )
    {
        sum -= Arb[ 2 * nod ];
        FuncSolve2( 2 * nod + 1 , middle + 1 , right , sum );
    }
    else
    {
        FuncSolve2( 2 * nod , left , middle , sum );
    }

}

int main()
{
    fin>>n>>m;

    for( i = 1 ; i <= n ; ++i )
    {
        fin>>val;
        pos = i;
        FuncUpdate( 1 , 1 , n );
    }

    for( i = 1 ; i <= m ; ++i )
    {
        fin>>q;
        if( q == 0 )
        {
            fin>>pos>>val;
            FuncUpdate( 1 , 1 , n );
        }
        else if( q == 1 )
        {
            fin>>in>>sf;
            ans = 0;
            FuncSolve1( 1 , 1 , n );
            fout<<ans<<'\n';
        }
        else if( q == 2 )
        {
            fin>>suma;
            FuncSolve2( 1 , 1 , n , suma );
            fout<<ans<<'\n';
        }
    }

return 0;
}