Cod sursa(job #1479484)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 31 august 2015 14:44:42
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <iostream>
#include <fstream>

using namespace std;

const int Nmax = 100005;

int N, M;
int BIT[Nmax];

inline int bit( int x )
{
    return ( x & ( -x ) );
}

void update( int pos, int val )
{
    while ( pos <= N )
    {
        BIT[pos] += val;
        pos += bit( pos );
    }
}

int sum( int lim )
{
    int s = 0;

    while ( lim > 0 )
    {
        s += BIT[lim];
        lim -= bit( lim );
    }

    return s;
}

int bin_search( int s )
{
    int step, i = 0;

    for ( step = 1; step < N; step <<= 1 );

    for ( ; step; step >>= 1 )
    {
        if ( i + step <= N )
        {
            if ( s >= BIT[i + step] )
            {
                i += step;
                s -= BIT[i];

                if ( s == 0 )
                        return i;
            }
        }
    }

    return -1;
}

int main()
{
    ifstream f("aib.in");
    ofstream g("aib.out");

    f >> N >> M;

    for ( int i = 1, val; i <= N; ++i )
    {
        f >> val;

        update( i, val );
    }

    for ( int i = 1, tip, val1, val2; i <= M; ++i )
    {
        f >> tip;

        switch ( tip )
        {
            case 0:
                    f >> val1 >> val2;
                    update( val1, val2 );

                    break;

            case 1:
                    f >> val1 >> val2;
                    g << sum( val2 ) - sum( val1 - 1 ) << "\n";

                    break;

            case 2:
                    f >> val1;
                    g << bin_search( val1 ) << "\n";

                    break;
        }
    }

    f.close();
    g.close();

    return 0;
}