Pagini recente » Profil M@2Te4i | Cod sursa (job #634876) | Statistici Ionut Cristian Ceausu (PreafericitulChao) | Cod sursa (job #604294) | Cod sursa (job #1761892)
#include <fstream>
#include <iostream>
template<class Iterator, class Numerical>
Iterator findLowerBound(Iterator first, Iterator last, const Numerical& x)
{
while (first != last) {
Iterator middle = first + (last - first) / 2;
if (*middle < x) {
first = middle + 1;
}
else {
last = middle;
}
}
return first;
}
template<class Iterator, class Numerical>
Iterator findUpperBound(Iterator first, Iterator last, const Numerical& x)
{
while (last - first > 1) {
Iterator middle = first + (last - first) / 2;
if (*middle <= x) {
first = middle + 1;
}
else {
last = middle;
}
}
return first;
}
template<class Iterator, class Numerical>
Iterator doBinarySearch(Iterator first, Iterator last, const Numerical& x)
{
Iterator it = findUpperBound(first, last, x);
if (*it == x) return it;
else return last;
}
int main()
{
std::ifstream input("cautbin.in");
std::ofstream output("cautbin.out");
int n, m;
int *v;
input >> n;
v = new int[n];
for (int i = 0; i < n; ++i) {
input >> v[i];
}
input >> m;
for (int i = 0; i < m; ++i) {
int type, x;
int* p;
input >> type >> x;
switch (type) {
case 0:
p = doBinarySearch(v, v + n, x);
break;
case 1:
p = findUpperBound(v, v + n, x);
break;
case 2:
p= findLowerBound(v, v + n, x);
break;
}
if (p == 0) output << "-1\n";
else output << p - v + 1 << '\n';
}
return 0;
}