Cod sursa(job #2406368)

Utilizator Doom6420Man jon Doom6420 Data 15 aprilie 2019 18:06:58
Problema Cautare binara Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.81 kb
#include <fstream>
#include <iostream>
using namespace std;
ifstream fin("cautbin.in");
ofstream fout("cautbin.out");
const int NMAX = 100001;
int sir[NMAX], N, M;
int cautareBinara(int v[], int st, int dr, int valoare) {
  while (st <= dr) {
    int m = (st + dr) / 2;
    if (v[m] == valoare)
      return m;
    else if (v[m] > valoare)
      dr = m - 1;
    else
      st = m + 1;
  }
  return -1;
}
int ultimaAparitieX(int x) {
  int a = 1;
  if (cautareBinara(sir, a, N, x) == -1)
    return -1;
  else
    while (cautareBinara(sir, a, N, x) != -1) {
      a = cautareBinara(sir, a, N, x) + 1;
    }
  return a - 1;
}

int pozitieMaximala(int v[], int st, int dr, int valoare) {
  while (st <= dr) {
    int m = (st + dr) / 2;
    if (v[m] <= valoare)
      return m;
    else
      dr = m - 1;
  }
  return -1;
}
int pozitieMinimala(int v[], int st, int dr, int valoare) {
  while (st <= dr) {
    int m = (st + dr) / 2;
    if (v[m] >= valoare)
      return m;
    else
      st = m + 1;
  }
  return -1;
}
int main() {
  fin >> N;
  for (int i = 1; i <= N; ++i)
    fin >> sir[i];
  fin >> M;
  for (int i = 0; i < M; ++i) {
    int operatie, x, a, k;
    fin >> operatie >> x;
    switch (operatie) {
    case 0:
      fout << ultimaAparitieX(x) << "\n";
      break;
    case 1:
      a = 1;
      while (pozitieMaximala(sir, a, N, x) != -1) {
        cout << "MAXIMAL" << endl;

        a = pozitieMaximala(sir, a, N, x) + 1;
      }
      fout << a - 1 << "\n";
      break;
    case 2:
      a = N;
      int k;
      while (pozitieMinimala(sir, 1, a, x) > 0) {
        k = pozitieMinimala(sir, 1, a, x);
        a = k - 1;
      }
      fout << k << "\n";
      break;
    default:
      break;
    }
  }
  fin.close();
  fout.close();
  return 0;
}