Cod sursa(job #645220)

Utilizator tak3rStefan Mirea tak3r Data 8 decembrie 2011 20:45:39
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include<iostream>
#include<cstdio>

#define NMAX 100001

using namespace std;

int n,a[NMAX],m;

void read(){
  int i;
  scanf( "%d", &n );
  for( i=0; i<n; ++i ){
    scanf( "%d", &a[i] );
  }
  scanf( "%d", &m );
}

int binary_search_equal( int number, int a[], int len ){
  int i, start=0, end=len, mid, pos = -1;
  while( start < end ){
    mid = start + (end - start) / 2;
    if( a[mid] == number ){
      pos = mid;
      start = mid+1;
    } else if( a[mid] < number ){
      start = mid+1;
    } else {
      end = mid;
    }
  }
  return pos != -1 ? ++pos : -1;
}

int binary_search_max( int number, int a[], int len ){
  int i, start=0, end=len, mid, pos = -1;
  while( start < end ){
    mid = start + (end - start) / 2;
    if( a[mid] <= number ){
      start = mid+1;
      pos = mid;
    } else {
      end = mid;
    }
  }
  return pos != -1 ? ++pos : -1;
}

int binary_search_min( int number, int a[], int len ){
  int i, start=0, end=len, mid, pos = -1;
  while( start < end ){
    mid = start + (end - start) / 2;
    if( a[mid] < number ){
      start = mid+1;
    } else {
      end = mid;
      pos = mid;
    }
  }
  return pos != -1 ? ++pos : -1;
}

int main(){
  int i;
  
  freopen( "cautbin.in", "r", stdin );
  freopen( "cautbin.out", "w", stdout );

  read();

  for( i=0; i<m; ++i ){
    int problem, number;
    scanf( "%d %d", &problem, &number );
    switch( problem ){
      case 0:
        printf( "%d\n", binary_search_equal( number, a, n ) );
        break;
      case 1:
        printf( "%d\n", binary_search_max( number, a, n ) );
        break;
      case 2:
        printf( "%d\n", binary_search_min( number, a, n ) );
        break;
    }
  }
  
}