#include <bits/stdc++.h> using namespace std; long long n, m, s; // Funkcja zwraca punkt w przedziale [start, end], który jest najbliżej s // (standardowe "clampowanie" wartości s do [start, end]). long long closestInInterval(long long s, long long start, long long end) { if (s < start) return start; if (s > end) return end; return s; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m >> s; vector<pair<long long, long long>> intervals(m); for(int i = 0; i < m; i++){ cin >> intervals[i].first >> intervals[i].second; } // Sortujemy przedziały według ich początku sort(intervals.begin(), intervals.end(), [](auto &a, auto &b){ return a.first < b.first; }); // Tworzymy listę "wolnych" przedziałów vector<pair<long long, long long>> freeIntervals; // 1) Wolny fragment przed pierwszym przedziałem, jeśli istnieje if(intervals[0].first > 1){ freeIntervals.push_back({1, intervals[0].first - 1}); } // 2) Wolne fragmenty pomiędzy kolejnymi przedziałami for(int i = 0; i < (int) intervals.size() - 1; i++){ long long leftEnd = intervals[i].second; long long rightStart = intervals[i+1].first; if(leftEnd + 1 <= rightStart - 1){ freeIntervals.push_back({leftEnd + 1, rightStart - 1}); } } // 3) Wolny fragment za ostatnim przedziałem, jeśli istnieje if(intervals[m-1].second < n){ freeIntervals.push_back({intervals[m-1].second + 1, n}); } // Przechowujemy najlepszą propozycję long long bestBuilding = -1; long long bestDist = LLONG_MAX; for(auto &fr : freeIntervals){ long long start = fr.first; long long end = fr.second; // Wyznaczamy budynek wewnątrz [start, end] najbliższy s long long candidate = closestInInterval(s, start, end); long long dist = llabs(candidate - s); // Porównujemy z najlepszym dotychczasowym wynikiem if(dist < bestDist || (dist == bestDist && candidate < bestBuilding)){ bestDist = dist; bestBuilding = candidate; } } cout << bestBuilding << "\n"; return 0; }
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 | #include <bits/stdc++.h> using namespace std; long long n, m, s; // Funkcja zwraca punkt w przedziale [start, end], który jest najbliżej s // (standardowe "clampowanie" wartości s do [start, end]). long long closestInInterval(long long s, long long start, long long end) { if (s < start) return start; if (s > end) return end; return s; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m >> s; vector<pair<long long, long long>> intervals(m); for(int i = 0; i < m; i++){ cin >> intervals[i].first >> intervals[i].second; } // Sortujemy przedziały według ich początku sort(intervals.begin(), intervals.end(), [](auto &a, auto &b){ return a.first < b.first; }); // Tworzymy listę "wolnych" przedziałów vector<pair<long long, long long>> freeIntervals; // 1) Wolny fragment przed pierwszym przedziałem, jeśli istnieje if(intervals[0].first > 1){ freeIntervals.push_back({1, intervals[0].first - 1}); } // 2) Wolne fragmenty pomiędzy kolejnymi przedziałami for(int i = 0; i < (int) intervals.size() - 1; i++){ long long leftEnd = intervals[i].second; long long rightStart = intervals[i+1].first; if(leftEnd + 1 <= rightStart - 1){ freeIntervals.push_back({leftEnd + 1, rightStart - 1}); } } // 3) Wolny fragment za ostatnim przedziałem, jeśli istnieje if(intervals[m-1].second < n){ freeIntervals.push_back({intervals[m-1].second + 1, n}); } // Przechowujemy najlepszą propozycję long long bestBuilding = -1; long long bestDist = LLONG_MAX; for(auto &fr : freeIntervals){ long long start = fr.first; long long end = fr.second; // Wyznaczamy budynek wewnątrz [start, end] najbliższy s long long candidate = closestInInterval(s, start, end); long long dist = llabs(candidate - s); // Porównujemy z najlepszym dotychczasowym wynikiem if(dist < bestDist || (dist == bestDist && candidate < bestBuilding)){ bestDist = dist; bestBuilding = candidate; } } cout << bestBuilding << "\n"; return 0; } |