Cod sursa(job #1618608)

Utilizator remus88Neatu Remus Mihai remus88 Data 27 februarie 2016 21:49:02
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.88 kb
/*  Cautare binara - O(logn)
    Cum cautam un element intr-un vector sortat crescator/descrescator?
    1. Cea mai mica pozitie unde am un element mai mare sau egal cu x.
        Exemplu: 1 2 3 4 5 6 7 8
                -1 2 3 4 7 7 7 9
                    Daca x = 4 => poz = 4
                    Daca x = 6 => poz = 5
        Solutie:
        int poz = upper_bound(v+1, v+1+n, x-1) - v;

    2. Cea mai mare pozitie pe care se afla un element cu valoarea mai mica sau egala cu x in sir.
        Exemplu: 1 2 3 4 5 6 7 8
                -1 2 3 4 7 7 7 9
            Daca x = 4 => poz = 4
            Daca x = 6 => poz = 4
        Solutie:
        lower_bound(v+1, v+1+n, x+1) - v - 1;
Daca vreau sa gasesc pe x (pozitia pe care se afla x; daca x apare de mai multe ori, nu ma intereseaza pe care il gasesc)
    atunci pot folosi oricare din cele 2 metode + verificare ca v[poz] == x


*/
#include <fstream>
#include <algorithm>
#define Nmax 100099
using namespace std;
ifstream f("cautbin.in");
ofstream g("cautbin.out");

int n,m,v[Nmax], poz;


// 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;

    //  verific daca functia de cautare mi-a gasit elementul dorit
    if (poz >= 1 && poz <= n && 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.
// 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;

    //  verific daca functia de cautare mi-a gasit elementul dorit
    if (poz >= 1 && poz <= n && 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.
// 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;

    //  verific daca functia de cautare mi-a gasit elementul dorit
    if (poz >= 1 && poz <= n && v[poz] >= x) {
        return poz;
    }

    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) {
        poz = cb(v, x);
        if (poz != -1) g << poz << '\n';
                else   g << -1 << '\n';
      }

      if(tip == 1) {
        poz = cb_down(v, x);
        if (poz != -1) g << poz << '\n';
                else   g << -1 << '\n';
      }

      if(tip == 2) {
        poz = cb_up(v, x);
        if (poz != -1) g << poz << '\n';
                else   g << -1 << '\n';
      }
  }
  f.close();g.close();
  return 0;
}