Cod sursa(job #525873)

Utilizator icepowdahTudor Didilescu icepowdah Data 26 ianuarie 2011 16:59:28
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include <fstream>
using namespace std;

int answerQ0(int *vect, int low, int high, int val);
int answerQ1(int *vect, int low, int high, int val);
int answerQ2(int *vect, int low, int high, int val);

int main(void)
{
  int n, m, i, qType, qVal;
  int *vect;

  ifstream f("cautbin.in");
  ofstream g("cautbin.out");

  f >> n;
  vect = new int[n];
  for (i=0;i<n;i++)
  {
    f >> vect[i];
  }

  f >> m;
  for (i=0;i<m;i++)
  {
    f >> qType;
    f >> qVal;

    switch(qType)
    {
    case 0:
      g << answerQ0(vect,0,n-1,qVal)+1 << endl;
      break;
    case 1:
      g << answerQ1(vect,0,n-1,qVal)+1 << endl;
      break;
    case 2:
      g << answerQ2(vect,0,n-1,qVal)+1 << endl;
      break;
    }
  }
  
  f.close();
  g.close();
  delete[] vect;
  return 0;
}

int answerQ0(int *vect, int low, int high, int val)
{
  if (low > high) return -2;

  if (low == high)
  {
    if (vect[low-1] == val)
      return low-1;
    else return -2;
  }

  int mid = low + (high-low)/2;
  if (vect[mid] <= val)
  {
    return answerQ0(vect,mid+1,high,val);
  }
  else 
  {
    return answerQ0(vect,low,mid-1, val);
  }
}

int answerQ1(int *vect, int low, int high, int val)
{
  if (low == high)
  {
    if (vect[low-1] == val)
    {
      return low-1;
    }
    return low;
  }
 
  int mid = low + (high-low)/2;
  if (vect[mid] > val)
  {
    return answerQ1(vect, low, mid-1,val);
  }
  else
  {
    return answerQ1(vect,mid+1,high,val);
  }
}

int answerQ2(int *vect, int low, int high, int val)
{
  if (low == high)
  {
    if (vect[low+1] == val)
    {
      return low+1;
    }
    return low;
  }
 
  int mid = low + (high-low)/2;
  if (vect[mid] >= val)
  {
    return answerQ1(vect, low, mid-1,val);
  }
  else
  {
    return answerQ1(vect,mid+1,high,val);
  }
}