Cod sursa(job #209556)

Utilizator redkar23Dezactiveazama redkar23 Data 23 septembrie 2008 09:43:50
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <iostream>
#include <fstream>

using namespace std;

int binary_search(int a[],int x,int n)
{
    int l=0;
    int h=n;
    int middle;

      while(l<h) {
         middle = (l+h)/2;
	 if(a[middle] < x)
            l = middle + 1;
         else
            h = middle;   
      }
   if(l < n && a[l] == x)
       return l;
   else 
       return -1;
}

int find_max(int a[],int x,int n)
{
    int pos=binary_search(a,x,n);
    while(1){
       if(pos == n-1) return pos;
       pos++;
       if(a[pos] !=x) return pos-1;
       }

}

int find_min_eq(int a[],int x,int n)
{
     int pos = binary_search(a,x,n);
    if(pos == -1)
        while(1){
          x--;
          pos = binary_search(a,x,n);
          if(pos != -1) return pos;
       }
     else return pos;   
}

int find_max_eq(int a[],int x, int n)
{
    int pos = binary_search(a,x,n);
    if(pos == -1)
       while(1){
          x++;
          pos = binary_search(a,x,n);
          if(pos != -1) return pos;
       }   
     else return pos;
}

int main()
{
    ifstream file("cautbin.in");

    int n;

    file >> n;
    int *el = new int[100000];
    int i;
    for(i=0;i<n;i++)
      file >> el[i];    

    int m;
    int id, x;

    file >> m;
	
    ofstream out("cautbin.out");
    for(i = 0 ;i < m;i++){
        file >> id;
	file >> x;
	
	switch(id){
	   case 0: out << find_max(el,x,n) << "\n"; break;
 	   case 1: out << find_min_eq(el,x,n) << "\n"; break;
           case 2: out << find_max_eq(el,x,n) << "\n"; break;
        }        
    }
    out.close();
    delete [] el;	
    return 0;
}