#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 |