Cod sursa(job #1284369)

Utilizator Emilia26Hangan Emilia Emilia26 Data 6 decembrie 2014 14:32:54
Problema Arbori indexati binar Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
using namespace std;

ifstream is("aib.in");
ofstream os("aib.out");

const int DIM = 100010;

int n, m, a, b;
int aib[DIM];

void Read();
void Solve();

void Update( int p, int v )
{
    for ( int i = p; i <= n; i += i & -i )
        aib[i] += v;
}

int Suma( int p )
{
    int s = 0;
    for ( int i = p; i; i -= i & -i )
        s += aib[i];
    return s;
}

int Bs( int v )
{
    int i = 0;
    int p = 1 << 15;
    for ( p = 1; p < n; p <<= 1 );

    for ( ; p; p >>= 1 )
        if ( i + p <= n && Suma(i+p) <= v )
            i += p;
    if ( Suma(i) == v )
        return i;
    return -1;
}


int main()
{
    Read();
    Solve();
    //for ( int i = 1; i <= n; ++i )
        //os << aib[i] << ' ';

    is.close();
    os.close();
    return 0;
}

void Read()
{
    is >> n >> m;
    int nr;
    for ( int i = 1; i <= n; ++i )
    {
        is >> nr;
        Update( i, nr );
    }
}

void Solve()
{
    for ( int k = 0; k < m; ++k )
    {
        is >> k >> a;
        if ( k == 0 )
        {
            is >> b;
            Update ( a, b );
        }
        if ( k == 1 )
        {
            is >> b;
            os << Suma(b) - Suma(a-1) << '\n';
        }
        if ( k == 2 )
        {
            os << Bs(a) << '\n';
        }
    }
}