#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
long long n, m, s;
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;
}
// Sort intervals
sort(intervals.begin(), intervals.end());
long long closest_left = -1;
long long closest_right = -1;
// Find the interval containing s or the closest intervals around s
int idx = -1;
for (int i = 0; i < m; i++) {
if (intervals[i].first <= s && s <= intervals[i].second) {
idx = i;
break;
}
if (intervals[i].first > s) {
// s is between intervals[i-1] and intervals[i]
closest_right = intervals[i].first - 1;
if (i > 0) {
closest_left = intervals[i-1].second + 1;
} else {
closest_left = 1; // No interval before, so first building is free
}
break;
}
}
if (idx != -1) {
// s is in intervals[idx]
// Check for free buildings to the left
if (idx > 0) {
closest_left = intervals[idx].first - 1;
if (closest_left < intervals[idx-1].second + 1) {
closest_left = intervals[idx-1].second + 1;
}
} else if (intervals[idx].first > 1) {
closest_left = intervals[idx].first - 1;
}
// Check for free buildings to the right
if (idx < m-1) {
closest_right = intervals[idx].second + 1;
if (closest_right > intervals[idx+1].first - 1) {
closest_right = intervals[idx+1].first - 1;
}
} else if (intervals[idx].second < n) {
closest_right = intervals[idx].second + 1;
}
} else if (intervals[m-1].second < s) {
// s is after all intervals
closest_left = intervals[m-1].second + 1;
}
// Ensure buildings are in valid range
if (closest_left < 1 || closest_left > n) closest_left = -1;
if (closest_right < 1 || closest_right > n) closest_right = -1;
// Calculate distances
long long left_dist = (closest_left != -1) ? abs(s - closest_left) : LLONG_MAX;
long long right_dist = (closest_right != -1) ? abs(s - closest_right) : LLONG_MAX;
if (left_dist < right_dist) {
cout << closest_left << endl;
} else if (right_dist < left_dist) {
cout << closest_right << endl;
} else if (closest_left != -1 && closest_right != -1) {
cout << min(closest_left, closest_right) << endl;
} else if (closest_left != -1) {
cout << closest_left << endl;
} else {
cout << closest_right << endl;
}
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 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | #include <iostream> #include <vector> #include <algorithm> #include <climits> using namespace std; int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); long long n, m, s; 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; } // Sort intervals sort(intervals.begin(), intervals.end()); long long closest_left = -1; long long closest_right = -1; // Find the interval containing s or the closest intervals around s int idx = -1; for (int i = 0; i < m; i++) { if (intervals[i].first <= s && s <= intervals[i].second) { idx = i; break; } if (intervals[i].first > s) { // s is between intervals[i-1] and intervals[i] closest_right = intervals[i].first - 1; if (i > 0) { closest_left = intervals[i-1].second + 1; } else { closest_left = 1; // No interval before, so first building is free } break; } } if (idx != -1) { // s is in intervals[idx] // Check for free buildings to the left if (idx > 0) { closest_left = intervals[idx].first - 1; if (closest_left < intervals[idx-1].second + 1) { closest_left = intervals[idx-1].second + 1; } } else if (intervals[idx].first > 1) { closest_left = intervals[idx].first - 1; } // Check for free buildings to the right if (idx < m-1) { closest_right = intervals[idx].second + 1; if (closest_right > intervals[idx+1].first - 1) { closest_right = intervals[idx+1].first - 1; } } else if (intervals[idx].second < n) { closest_right = intervals[idx].second + 1; } } else if (intervals[m-1].second < s) { // s is after all intervals closest_left = intervals[m-1].second + 1; } // Ensure buildings are in valid range if (closest_left < 1 || closest_left > n) closest_left = -1; if (closest_right < 1 || closest_right > n) closest_right = -1; // Calculate distances long long left_dist = (closest_left != -1) ? abs(s - closest_left) : LLONG_MAX; long long right_dist = (closest_right != -1) ? abs(s - closest_right) : LLONG_MAX; if (left_dist < right_dist) { cout << closest_left << endl; } else if (right_dist < left_dist) { cout << closest_right << endl; } else if (closest_left != -1 && closest_right != -1) { cout << min(closest_left, closest_right) << endl; } else if (closest_left != -1) { cout << closest_left << endl; } else { cout << closest_right << endl; } return 0; } |
English