Cod sursa(job #1615968)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 26 februarie 2016 23:55:28
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <fstream>
#include <algorithm>
#define Nmax 100099
using namespace std;
ifstream f("cautbin.in");
ofstream g("cautbin.out");

int n,m,v[Nmax];


// cea mai mare/cea mai mica pozitie pe care se afla x;
// Se garanteaza ca cel mai mic numar al sirului este mai mic sau egal decat x
int cb(int v[Nmax], int x) {
    //int poz=lower_bound(v+1, v+1+n, x+1) - v - 1;
    int poz=upper_bound(v+1, v+1+n, x-1) - v;

    if (poz >= 1 && poz <= n && v[poz] == x) {
        return poz;
    } else {
        return -1;
    }
}

// cea mai mare pozitie pe care se afla un element cu valoarea mai mica sau egala cu x in sir.
// Se garanteaza ca cel mai mic numar al sirului este mai mic sau egal decat x
int cb_down(int v[Nmax], int x) {
    int poz=lower_bound(v+1, v+1+n, x+1) - v - 1;

    if (poz >= 1 && poz <= n && v[poz] <= x) {
        return poz;
    } else {
        return -1;
    }
}

// cea mai mica pozitie pe care se afla un element cu valoarea mai mare sau egala cu x in sir.
// Se garanteaza ca cel mai mare numar din sir este mai mare sau egal decat x
int cb_up(int v[Nmax], int x) {
    int poz=upper_bound(v+1, v+1+n, x-1) - v;

    if (poz >= 1 && poz <= n && v[poz] >= x) {
        return poz;
    } else {
        return -1;
    }
}

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

  for(int i = 1; i <= m; ++i) {
      int tip, x;
      f >> tip >> x;

      if(!tip) {
        g << cb(v, x)<<'\n';
        continue;
      }

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

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