Pagini recente » Cod sursa (job #1746740) | Cod sursa (job #2467200)
#include <fstream>
#include <vector>
size_t b1(const std::vector<unsigned>& v, unsigned lookup, size_t startIndex, size_t len) {
// primul element mai mare
while (len) {
size_t m = startIndex + len / 2;
if (v[m] > lookup) {
len = len / 2;
} else {
startIndex += len / 2 + 1;
len = len - len / 2 - 1;
}
}
return startIndex;
}
int b2(const std::vector<unsigned>& v, unsigned lookup, size_t startIndex, size_t len) {
// primul element mai mare sau egal
while (len) {
size_t m = startIndex + len / 2;
if (v[m] >= lookup) {
len = len / 2;
} else {
startIndex += len / 2 + 1;
len = len - len / 2 - 1;
}
}
return startIndex;
}
int bb1(const std::vector<unsigned>& v, unsigned lookup, size_t startIndex, size_t len) {
size_t firstHi = b1(v, lookup, startIndex, len);
return firstHi > 0 && v[firstHi - 1] == lookup ? firstHi - 1 : firstHi;
}
int b0(const std::vector<unsigned>& v, unsigned lookup, size_t startIndex, size_t len) {
int result = bb1(v, lookup, startIndex, len);
return v[result] == lookup ? result: -2;
};
using QueryFunc = int(const std::vector<unsigned>&, unsigned, size_t, size_t);
// 1 3 3 3 5 6 7
//
//
int main() {
std::ifstream fin("cautbin.in");
std::ofstream fout("cautbin.out");
size_t n;
fin >> n;
std::vector<unsigned> v;
v.reserve(n);
for (size_t i = 0; i < n; ++i) {
unsigned el;
fin >> el;
v.push_back(el);
}
QueryFunc* const queries[] = {b0, bb1, b2};
size_t m, query;
unsigned lookup;
fin >> m;
for (size_t i = 0; i < m; ++i) {
fin >> query >> lookup;
int res = queries[query](v, lookup, 0, v.size());
fout << res + 1 << std::endl;
}
return 0;
}