Pagini recente » Cod sursa (job #1538361) | Cod sursa (job #2641751) | Cod sursa (job #1945561) | Cod sursa (job #2261972) | Cod sursa (job #1618608)
/* 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;
}