#include <iostream>
#include <map>
using range_map_t = std::map<uint64_t, uint64_t>;
uint64_t first_empty_lower(range_map_t &m, range_map_t::iterator &it) {
auto begin = it->first;
while (it != m.begin()) {
--it;
if (begin - it->second > 1)
{
return begin - 1;
}
else {
begin = it->first;
}
}
if (begin > 1) {
return begin - 1;
}
return 0;
}
uint64_t first_empty_higher(uint64_t n, range_map_t &m, range_map_t::iterator &it) {
auto end = it->second;
while (it != m.end()) {
++it;
if (it == m.end()) {
break;
}
if (it->first - end > 1)
{
return end + 1;
}
else {
end = it->second;
}
}
if (end < n) {
return end + 1;
}
return 0;
}
void prog_main(std::istream& in, std::ostream& out)
{
uint64_t n, m, s;
in >> n;
in >> m;
in >> s;
range_map_t ranges;
for (uint64_t i = 0; i < m; ++i) {
uint64_t l, r;
in >> l;
in >> r;
ranges.emplace(std::make_pair(l, r));
}
auto result = ranges.emplace(std::make_pair(s,s));
range_map_t::iterator it;
uint64_t sch_range = s;
if (result.second)
{
it = result.first;
--it;
sch_range = it->first;
++it;
ranges.erase(it);
it = ranges.find(sch_range);
} else {
it = result.first;
sch_range = it->first;
}
uint64_t lower = first_empty_lower(ranges, it);
it = ranges.find(sch_range);
uint64_t higher = first_empty_higher(n, ranges, it);
if (lower == 0) {
out << higher << std::endl;
return;
}
if (higher == 0) {
out << lower << std::endl;
return;
}
if (s - lower <= higher -s) {
out << lower << std::endl;
} else {
out << higher << std::endl;
}
}
#ifndef TEST
int main(int argc, char* argv[])
{
prog_main(std::cin, std::cout);
return 0;
}
#endif
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | #include <iostream> #include <map> using range_map_t = std::map<uint64_t, uint64_t>; uint64_t first_empty_lower(range_map_t &m, range_map_t::iterator &it) { auto begin = it->first; while (it != m.begin()) { --it; if (begin - it->second > 1) { return begin - 1; } else { begin = it->first; } } if (begin > 1) { return begin - 1; } return 0; } uint64_t first_empty_higher(uint64_t n, range_map_t &m, range_map_t::iterator &it) { auto end = it->second; while (it != m.end()) { ++it; if (it == m.end()) { break; } if (it->first - end > 1) { return end + 1; } else { end = it->second; } } if (end < n) { return end + 1; } return 0; } void prog_main(std::istream& in, std::ostream& out) { uint64_t n, m, s; in >> n; in >> m; in >> s; range_map_t ranges; for (uint64_t i = 0; i < m; ++i) { uint64_t l, r; in >> l; in >> r; ranges.emplace(std::make_pair(l, r)); } auto result = ranges.emplace(std::make_pair(s,s)); range_map_t::iterator it; uint64_t sch_range = s; if (result.second) { it = result.first; --it; sch_range = it->first; ++it; ranges.erase(it); it = ranges.find(sch_range); } else { it = result.first; sch_range = it->first; } uint64_t lower = first_empty_lower(ranges, it); it = ranges.find(sch_range); uint64_t higher = first_empty_higher(n, ranges, it); if (lower == 0) { out << higher << std::endl; return; } if (higher == 0) { out << lower << std::endl; return; } if (s - lower <= higher -s) { out << lower << std::endl; } else { out << higher << std::endl; } } #ifndef TEST int main(int argc, char* argv[]) { prog_main(std::cin, std::cout); return 0; } #endif |
English