Cod sursa(job #2429238)

Utilizator pickleVictor Andrei pickle Data 8 iunie 2019 16:15:03
Problema Cautare binara Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <stdio.h>
#include <bits/stdc++.h>

#define rep(i, n) for(int i = 0; i < n; i++)
#define repa(i, l, r) for (int i = l; i < r; i++)
#define repd(i, r, l) for (int i = r; i > l; i--)

using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
const int Nmax = 100555;
ifstream fin ("cautbin.in");
ofstream fout ("cautbin.out");
int N,M;
int a[Nmax];

int op_01(int x) {
  // for operations type 0 and 1.
  // cea mai mare pozitie cu un element <= x
  int lo = 0, hi = N-1;
  while (lo < hi) {
    int mid = lo + (hi + 1 - lo) / 2;
    if (a[mid] <= x) {
      lo = mid;
    } else { // a[mid] > x
      hi = mid - 1;
    }
  }
  return lo;
}

int op_2(int x) {
  // cea mai mica pozitie cu un element >= x
  int lo = 0, hi = N-1;
  while (lo < hi) {
    int mid = lo + (hi - lo) / 2;
    if (a[mid] >= x) {
      hi = mid;
    } else { // a[mid] < x
      lo = mid + 1;
    }
  }
  return lo;
}

int main(void) {
  fin >> N;
  rep(i, N) {
    fin >> a[i];
  }

  int q,x;
  fin >> M;
  rep(i,M) {
    fin >> q >> x;

    if (q == 0) {
      // find x or output -1;
      int res = op_01(x);
      fout << (a[res] == x ? res + 1 : -1) << '\n';
    } else if (q == 1) {
      // cea mai mare pozitie cu un element <= x
      fout << op_01(x) + 1 << '\n';
    } else if (q == 2) {
      // cea mai mica pozitie cu un element >= x
      fout << op_2(x) + 1 << '\n';
    }
  }

  return 0;
}