Cod sursa(job #1361980)

Utilizator Stefanescu_MihaiStefanescu Mihai-Nicolae Stefanescu_Mihai Data 26 februarie 2015 08:46:32
Problema Arbori indexati binar Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.1 kb
#include <fstream>

using namespace std;

#define fileIn "aib.in"
#define fileOut "aib.out"

#define maxN 100005
#define maxM 150005

short arb[maxN * 2];

int pos, val;
void update( int lo, int hi, int node )
{
    if ( lo >= hi )
    {
        arb[node] += val;
        return;
    }

    int mid = ( lo + hi ) >> 1;

    if ( pos <= mid )
        update( lo, mid, node << 1 );
    else
        update( mid + 1, hi, ( node << 1 ) + 1 );

    arb[node] = arb[node << 1] + arb[ ( node << 1 ) + 1 ];
}

int pos1, pos2, maxS;
void query( int lo, int hi, int node )
{
    if ( ( lo >= pos1 ) && ( hi <= pos2 ) )
    {
        maxS += arb[node];
        return;
    }

    int mid = ( lo + hi ) >> 1;

    if ( pos1 <= mid )
        query( lo, mid, node << 1 );
    if ( pos2 > mid )
        query( mid + 1, hi, ( node << 1 ) + 1 );
}

int main()
{
    ifstream sIn( fileIn );
    ofstream sOut( fileOut );

    int n, m, i;
    int p;

    sIn >> n >> m;

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

    for ( i = 1; i <= m; ++i )
    {
        sIn >> p;
        switch ( p )
        {
            case 0:
            {
                sIn >> pos >> val;
                update( 1, n, 1 );
                break;
            }
            case 1:
            {
                sIn >> pos1 >> pos2;
                maxS = 0;
                query( 1, n, 1 );
                sOut << maxS << '\n';
                break;
            }
            case 2:
            {
                sIn >> p;
                pos1 = 1;
                for ( pos2 = 1; pos2 <= n; ++pos2 )
                {
                    maxS = 0;
                    query( 1, n, 1 );
                    if ( maxS == p )
                    {
                        sOut << pos2 << '\n';
                        break;
                    }
                }
                if ( pos2 == n + 1 )
                    sOut << "-1" << '\n';
                break;
            }
        }
    }

    return 0;
}