Cod sursa(job #2562936)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 29 februarie 2020 20:19:54
Problema Cautare binara Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <cstdio>
#include <vector>

using namespace std;
vector<int> v;

int upper_bound(int x)
{
  int li = 0, lf = (int)v.size() - 1, m;
  while (li <= lf) {
    m = li + ((lf - li) >> 1);
    if (v[m] <= x)
      li = m + 1;
    else
      lf = m - 1;
  }
  return lf;
}

int lower_bound(int x)
{
  int li = 0, lf = (int)v.size() - 1, m;
  while (li <= lf) {
    m = li + ((lf - li) >> 1);
    if (v[m] >= x)
      lf = m - 1;
    else
      li = m + 1;
  }
  return li;
}

int main()
{
  freopen("cautbin.in", "r", stdin);
  freopen("cautbin.out", "w", stdout);

  int N, M;
  scanf("%d", &N);
  for (int i = 0; i < N; ++i) {
    int x;
    scanf("%d", &x);
    v.emplace_back(x);
  }
  scanf("%d", &M);
  for (int i = 0; i < M; ++i) {
    int op, x;
    scanf("%d%d", &op, &x);
    if (op == 0) {
      int pz = upper_bound(x);
      if (v[pz] == x)
	printf("%d\n", pz + 1);
      else
	printf("-1\n");
      continue;
    }
    if (op == 1) {
      printf("%d\n", upper_bound(x) + 1);
      continue;
    }
    printf("%d\n", lower_bound(x) + 1);
  }
  return 0;
}