Cod sursa(job #2246589)

Utilizator ImbuzanRaduImbuzan Radu ImbuzanRadu Data 27 septembrie 2018 11:23:32
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <iostream>
#include <fstream>

using namespace std;

struct intrebare{
  int tip, nr;
};

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

int n, a[10001], x, m;
intrebare intr[10001];

int cautBin1(int st, int dr,int x)
{
  if(st >= dr) return -1;

  int m = st + (st + dr) / 2;

  if(x == a[m]) return m;
  if(x > a[m])
    return cautBin1(m + 1, dr , x);
  else return cautBin1(st, m - 1, x);
}

int cautBin2(int st, int dr,int x)
{
  if(st >= dr) return -1;

  int m = st + (st + dr) / 2;

  if(x == a[m]) {
      if(a[m - 1] == a[m])
        return m;
      else return m-1;
  }
  if(x > a[m])
    return cautBin2(m + 1, dr , x);
  else return cautBin2(st, m - 1, x);
}

int cautBin3(int st, int dr,int x)
{
  if(st >= dr) return -1;

  int m = st + (st + dr) / 2;

  if(x == a[m]) {
      if(a[m - 1] == a[m])
      {
        while(a[m - 1] == a[m])
        {
          m--;
        }
        return m;
      }
      else return m-1;
  }
  if(x > a[m])
    return cautBin3(m + 1, dr , x);
  else return cautBin3(st, m - 1, x);
}

void rezolvare(int tip, int nr)
{
  if(tip == 0)
    g<<cautBin1(1, n, nr)<<'\n';
  if(tip == 1)
    g<<cautBin2(1, n, nr)<<'\n';
  if(tip == 2)
    g<<cautBin3(1, n, nr)<<'\n';

     //g<<cautBin3(1, n, nr)<<'\n';
}

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

    f>>m;

    for(int i = 1; i <= m; i++)
    {
      f>>intr[i].tip>>intr[i].nr;
    }

    for(int i = 1; i <= m; i++)
      rezolvare(intr[i].tip, intr[i].nr);
    return 0;
}