Cod sursa(job #1263090)

Utilizator Emilia26Hangan Emilia Emilia26 Data 13 noiembrie 2014 21:53:15
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 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 ( i == 0 )
        return -1;
    return i;
}


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';
        }
    }
}