Pagini recente » Cod sursa (job #1497235) | Cod sursa (job #382893) | Istoria paginii utilizator/costantinteodora | Cod sursa (job #792157) | Cod sursa (job #1761889)
#include <fstream>
#include <iostream>
template<class Iterator, class Numerical>
Iterator findUpperBound(Iterator first, Iterator last, const Numerical& x)
{
if (*first > x) return last;
while (last - first > 1) {
Iterator middle = first + (last - first) / 2;
if (*middle <= x) {
first = middle;
}
else {
last = middle;
}
}
return first;
}
template<class Iterator, class Numerical>
Iterator findLowerBound(Iterator first, Iterator last, const Numerical& x)
{
if (*first >= x) return first;
while (last - first > 1) {
Iterator middle = first + (last - first) / 2;
if (*middle < x) {
first = middle;
}
else {
last = middle;
}
}
return last;
}
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;
}