#include <iostream>
#include <utility>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
long long n;
int m;
long long s;
cin >> n >> m >> s;
vector<pair<long long, long long>> przedzialy;
przedzialy.reserve(m);
long long l, r;
for (int i = 0; i < m; i++)
{
cin >> l >> r;
pair<long long, long long> przedzial = {l, r};
przedzialy.push_back(przedzial);
}
// sortujemy przedzialy (od tego najbardziej na lewo)
sort(przedzialy.begin(), przedzialy.end(),
[](const pair<long long, long long> &a, const pair<long long, long long> &b)
{
return a.first < b.first;
});
// szukanie najlepszego miejsca po lewej
long long na_lewo = s - 1;
int i = m - 1;
while (!(przedzialy[i].first <= s - 1 && przedzialy[i].second >= s - 1))
{
i--;
if (i < 0)
{
break;
}
}
while (i >= 0)
{
na_lewo = przedzialy[i].first - 1;
i--;
if (i >= 0 && przedzialy[i].second < na_lewo)
{
break;
}
}
// szukanie prawego odstepu
long long na_prawo = s + 1;
i = 0;
while (!(przedzialy[i].first <= s + 1 && przedzialy[i].second >= s + 1))
{
i++;
if (i >= m)
{
break;
}
}
while (i < m)
{
na_prawo = przedzialy[i].second + 1;
i++;
if (i < m && przedzialy[i].first > na_prawo)
{
break;
}
}
if (na_prawo > n)
{
cout << na_lewo << "\n";
}
else if (na_lewo <= 0)
{
cout << na_prawo << "\n";
}
else if (s - na_lewo <= na_prawo - s)
{
cout << na_lewo << "\n";
}
else
{
cout << na_prawo << "\n";
}
}
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 | #include <iostream> #include <utility> #include <vector> #include <algorithm> using namespace std; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); long long n; int m; long long s; cin >> n >> m >> s; vector<pair<long long, long long>> przedzialy; przedzialy.reserve(m); long long l, r; for (int i = 0; i < m; i++) { cin >> l >> r; pair<long long, long long> przedzial = {l, r}; przedzialy.push_back(przedzial); } // sortujemy przedzialy (od tego najbardziej na lewo) sort(przedzialy.begin(), przedzialy.end(), [](const pair<long long, long long> &a, const pair<long long, long long> &b) { return a.first < b.first; }); // szukanie najlepszego miejsca po lewej long long na_lewo = s - 1; int i = m - 1; while (!(przedzialy[i].first <= s - 1 && przedzialy[i].second >= s - 1)) { i--; if (i < 0) { break; } } while (i >= 0) { na_lewo = przedzialy[i].first - 1; i--; if (i >= 0 && przedzialy[i].second < na_lewo) { break; } } // szukanie prawego odstepu long long na_prawo = s + 1; i = 0; while (!(przedzialy[i].first <= s + 1 && przedzialy[i].second >= s + 1)) { i++; if (i >= m) { break; } } while (i < m) { na_prawo = przedzialy[i].second + 1; i++; if (i < m && przedzialy[i].first > na_prawo) { break; } } if (na_prawo > n) { cout << na_lewo << "\n"; } else if (na_lewo <= 0) { cout << na_prawo << "\n"; } else if (s - na_lewo <= na_prawo - s) { cout << na_lewo << "\n"; } else { cout << na_prawo << "\n"; } } |
English