Pagini recente » Cod sursa (job #676381) | Cod sursa (job #3127448) | Cod sursa (job #363335) | Cod sursa (job #1420222) | Cod sursa (job #2611337)
#include <fstream>
#include <iostream>
#include <vector>
auto read_input(std::ifstream& f) -> std::vector<int>
{
std::vector<int> result{};
int count{ 0 };
f >> count;
result.reserve(static_cast<std::size_t>(count));
for(int i = 0; i < count; ++i) {
int tmp{ 0 };
f >> tmp;
result.push_back(tmp);
}
return result;
}
auto search_0(std::vector<int> const& v, int const value, int l, int r) -> int
{
auto mid = 0U;
while(l <= r) {
mid = static_cast<unsigned>(l + (r - l) / 2);
if(v[mid] <= value) {
l = static_cast<int>(mid) + 1;
}
else {
r = static_cast<int>(mid) - 1;
}
}
mid = static_cast<unsigned>(l + r) / 2;
if(v[mid] > value) {
--mid;
}
return v[mid] == value ? static_cast<int>(mid) : -1;
}
auto search_1(std::vector<int> const& v, int const value, int l, int r) -> int
{
auto mid = 0U;
while(l <= r) {
mid = static_cast<unsigned>(l + (r - l) / 2);
if(v[mid] <= value) {
l = static_cast<int>(mid) + 1;
}
else {
r = static_cast<int>(mid) - 1;
}
}
mid = static_cast<unsigned>(l + r) / 2;
if(v[mid] > value) {
--mid;
}
return static_cast<int>(mid);
}
auto search_2(std::vector<int> const& v, int const value, int l, int r) -> int
{
auto mid = 0U;
while(l <= r) {
mid = static_cast<unsigned>(l + (r - l) / 2);
if(v[mid] < value) {
l = static_cast<int>(mid) + 1;
}
else {
r = static_cast<int>(mid) - 1;
}
}
mid = static_cast<unsigned>(l + r) / 2;
if(v[mid] < value) {
++mid;
}
return static_cast<int>(mid);
}
auto run_queries(std::ifstream& f, std::vector<int> const& v) -> void
{
std::ofstream g{ "cautbin.out" };
int count{ 0 };
auto limit = static_cast<int>(v.size()) - 1;
f >> count;
for(int i = 0; i < count; ++i) {
int action{ 0 };
int num{ 0 };
f >> action >> num;
switch(action) {
case 0: {
auto n = search_0(v, num, 0, limit);
if(n != -1) {
g << n + 1 << std::endl;
}
else {
g << n << std::endl;
}
break;
}
case 1: {
auto n = search_1(v, num, 0, limit);
if(n != -1) {
g << n + 1 << std::endl;
}
else {
g << n << std::endl;
}
break;
}
case 2: {
auto n = search_2(v, num, 0, limit);
if(n != -1) {
g << n + 1 << std::endl;
}
else {
g << n << std::endl;
}
break;
}
default: {
break;
}
}
}
}
auto main() noexcept -> int
{
std::ifstream f{ "cautbin.in" };
run_queries(f, read_input(f));
}