Cod sursa(job #382628)

Utilizator rayvianPricope Razvan rayvian Data 14 ianuarie 2010 10:44:51
Problema Cautare binara Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
#include <iostream>
#include <iterator>
#include <string>
using namespace std;

#define PATH ""
ifstream f((string(PATH)+string("cautbin.in")).c_str());
ofstream g((string(PATH)+string("cautbin.out")).c_str());
const unsigned int SIZE=100000;


#define INF 0x7fffffff;

int v[SIZE];
struct
{
  int op;
  int  numar;
}operatii[SIZE];
int n;
int m;

typedef unsigned char tip_op;

int return_pozitie(int start,int end,int element,tip_op tip)
{
  if(start==end)
    if(tip==0)
    {
      if(v[start]==element)
       return start;
      else
        return -1;
    }
    else if(tip==1)
    {
      if(v[start]<=element)
        return start;
      else
        return -1;
    }
    else if(tip==2)
    {
      if(v[start]>=element)
        return start;
      else
        return INF;
    }


  int mijloc=start+(end-start)/2;

  int p1=return_pozitie(start,mijloc,element,tip);
  int p2=return_pozitie(mijloc+1,end,element,tip);

  if(tip==1 || tip==0)
    return (p1>p2?p1:p2);

  else if(tip==2)
    return (p1<p2?p1:p2);
}


int main()
{
  f>>n;
  for(int i=1; i<=n; i++)
    f>>v[i];
  f>>m;

  for(int i=1; i<=m; i++)
    f>>operatii[i].op>>operatii[i].numar;

  for(int i=1; i<=m; i++)
//    if(operatii[i].op==0)
      g<<return_pozitie(1,n,operatii[i].numar,operatii[i].op)<<endl;

  
  return 0;
}