Cod sursa(job #2375265)

Utilizator Andrei-27Arhire Andrei Andrei-27 Data 7 martie 2019 23:43:11
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <bits/stdc++.h>
#define zero(pos) pos&(-pos)
using namespace std;
const int NR = 100005 ;
ifstream in ("aib.in") ;
ofstream out ("aib.out") ;
int aib [ NR ] , n , q ;
void update ( int pos , int val )
{
    for ( ; pos <= n ; pos += zero( pos ) ) aib [ pos ] += val ;
}
int sum ( int pos )
{
    int s = 0 ;
    for ( ; pos ; pos -= zero (pos) )  s += aib [ pos ] ;
    return s ;
}
int main ()
{
    int x , tip , a , b , st , dr , mid;
    in >> n >> q ;
    for( int i = 1 ; i <= n ; ++ i )
    {
        in >> x ;
        update( i , x ) ;
    }
    while ( q -- )
    {
        in >> tip ;
        if ( tip == 0 )
        {
            in >> a >> b ;
            update( a , b ) ;
        }
        if ( tip == 1 )
        {
            in >> a >> b ;
            out << sum(b) - sum(a-1) << '\n' ;
        }
        if ( tip == 2 )
        {
            in >> a ;
            st = 0 ; dr = n ;
            while ( st <= dr )
            {
                mid = ( st + dr ) >> 1 ;
                if ( sum(mid) == a )    { out << mid << '\n' ; break ; }
                if ( sum(mid) > a ) dr = mid - 1 ;
                else                st = mid + 1 ;
            }
            if ( st > dr )  out << "-1\n" ;
        }
    }

}