Pagini recente » Cod sursa (job #3213478) | Cod sursa (job #3212032) | Cod sursa (job #384353) | Cod sursa (job #2241867) | Cod sursa (job #1510824)
#include <cstdio>
using namespace std;
FILE *f = fopen ( "cautbin.in" , "r" ) , *g = fopen ( "cautbin.out" , "w" );
const int MAX = 100005;
unsigned int N , i , myInts [ MAX ] , NrRequests , mid , value , type , index;
void read()
{
fscanf ( f , "%d" , &N );
for ( i = 0 ; i < N ; i ++ )
fscanf ( f , "%d" , &myInts [ i ] );
fscanf ( f , "%d" , &NrRequests );
}
int maxBinSearch ( int left , int right , int value )
{
while ( left + 1 < right )
{
mid = ( left + right ) / 2;
if ( myInts [ mid ] > value )
right = mid;
else
left = mid + 1;
}
if ( myInts [ left ] > value || left == N )
left --;
return left;
}
int minBinSearch ( int left , int right , int value )
{
while ( left + 1 < right )
{
mid = ( left + right ) / 2;
if ( myInts [ mid ] < value )
left = mid + 1;
else
right = mid;
}
if ( myInts [ left ] < value && left + 1 < N )
left ++;
return left;
}
void deal()
{
// we print index + 1 instead of index because we're using myInts[0..N)
for ( i = 0 ; i < NrRequests ; i ++ )
{
fscanf ( f , "%d %d\n" , &type , &value );
if ( type == 2 )
{
index = minBinSearch ( 0 , N , value );
fprintf ( g , "%d\n" , index + 1 );
}
else
{
index = maxBinSearch ( 0 , N , value );
if ( type == 0 )
if ( value == myInts [ index ] )
fprintf ( g , "%d\n" , index + 1 );
else
fprintf ( g , "-1\n" );
else
fprintf ( g , "%d\n" , index + 1 );
}
}
}
int main()
{
read();
deal();
return 0;
}