Cod sursa(job #1921209)

Utilizator AndreiGrigorasAndrei Grigoras AndreiGrigoras Data 10 martie 2017 11:44:52
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>
#define NMAX 100100

using namespace std ;

ofstream fout ( "aib.out" ) ;

int Arb[NMAX], N, M ;

void Update ( int pos, int value )
{
    for ( int i = pos ; i <= N ; i += ( i & (-i) ) )
        Arb[i] += value ;
}

int Query ( int pos )
{
    int sum = 0 ;
    for ( int i = pos ; i > 0 ; i -= ( i & (-i) ) )
        sum += Arb[i] ;
    return sum ;
}

int Search ( int value )
{
    int step ;
    for ( step = 1 ; step < N ; step <<= 1 ) ;
    for ( int i = 0 ; step ; step >>= 1 )
        if ( i + step <= N && value >= Arb[i + step] )
        {
            i += step, value -= Arb[i] ;
            if ( !value ) return i ;
        }
    return -1 ;
}

void read()
{
    int x, y, op ;
    freopen ( "aib.in", "r", stdin ) ;
    scanf ( "%d %d", &N, &M ) ;
    for ( int i = 1 ; i <= N ; i++ )
        scanf ( "%d", &x ), Update( i, x ) ;
    for ( int i = 1 ; i <= M ; i++ )
    {
        scanf ( "%d", &op ) ;
        if ( op == 0 )
            scanf ( "%d %d", &x, &y ), Update( x, y ) ;
        if ( op == 1 )
            scanf ( "%d %d", &x, &y ), fout << Query(y) - Query(x - 1) << '\n' ;
        if ( op == 2 )
            scanf ( "%d", &x), fout << Search(x) << '\n' ;
    }
}

int main()
{
    read() ;
    return 0 ;
}