Cod sursa(job #1420908)

Utilizator code_and_rosesUPB Dinu Neatu Rotaru code_and_roses Data 19 aprilie 2015 09:49:39
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <fstream>
#include <algorithm>
#include <vector>
#define Nmax 100099
using namespace std;
ifstream f("cautbin.in");
ofstream g("cautbin.out");
 
int N, M;
vector<int> v;

//cea mai mare pozitie pe care se afla un element cu valoarea x
//sau -1 daca aceasta valoare nu se gaseste in sir

int cb(vector<int>& v, const int& x) {
  int poz = upper_bound(v.begin(), v.end(), x) - v.begin() - 1;
        
  if(poz >= 0 && poz < (int)v.size() && v[poz] == x) {
    return poz;
  }
  return -1;
}

//cea mai mare pozitie pe care se afla un element cu valoarea 
//mai mica sau egala cu x in sir.
int cb_up(vector<int>& v, const int& x){
  int poz = lower_bound(v.begin(), v.end(), x+1) - v.begin() - 1;

  if(poz >= 0 && poz < (int)v.size() && v[poz] <= x) {
    return poz;
  }
  return -1;
}

//cea mai mica pozitie pe care se afla un element cu valoarea
//mai mare sau egala cu x in sir.
int cb_down(vector<int>& v, const int& x) {
  int poz = upper_bound(v.begin(), v.end(), x-1) - v.begin();

  if(poz >= 0 && poz < (int)v.size() && v[poz] >= x) {
    return poz;
  }
  return -1;
}

int main() {
  f >> N;
  for(int i = 1; i <= N; ++i) {
    int x;
    f >> x;
    v.push_back(x);
  }
  f >> M;

  for(int i = 1; i <= M; ++i) {
      int tip, x;
      f >> tip >> x;
      
      if(!tip) {
        g << cb(v, x) + 1<<'\n';
        continue;
      }

      if(tip == 1) {
        g << cb_up(v, x) + 1<<'\n';
        continue;
      }

      if(tip == 2) {
        g << cb_down(v, x) + 1<<'\n';
        //continue;
      }
  }
  f.close();g.close();
  return 0;
}