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
#include <algorithm>
#include <iostream>
#include <vector>

using namespace std;

struct Interval
{
	long long l, r;
};

int main()
{
	long long n, m, s;
	cin >> n >> m >> s;
	vector<Interval> intervals(m);

	// Wczytanie przedziałów
	for (int i = 0; i < m; i++)
	{
		cin >> intervals[i].l >> intervals[i].r;
	}

	// Sortowanie przedziałów według wartości początkowej l
	sort(intervals.begin(), intervals.end(), [](const Interval &a, const Interval &b)
	     { return a.l < b.l; });

	// Przeszukujemy wokół s, aby znaleźć pierwszy wolny budynek
	size_t i = 0;
	while (i < intervals.size() && intervals[i].r < s) i++;
	int start_interval = i;

	// Najpierw szukamy w lewo
	int left_i = i, right_i = i;

	long long left = 0;
	while (left_i >= 1 && intervals[left_i].l == intervals[left_i - 1].r + 1)
	{
		left_i--;
	}
	left = intervals[left_i].l - 1;

	// Szukamy w prawo
	long long right = n;
	while (right_i < m && intervals[right_i].r == intervals[right_i + 1].l - 1)
	{
		right_i++;
	}
	right = intervals[right_i].r + 1;

	// Porównanie, który budynek jest bliżej
	long long best_building = -1;
	if (left >= 1 && (right > n || abs(s - left) <= abs(s - right)))
	{
		best_building = left;
	}
	else if (right <= n)
	{
		best_building = right;
	}

	cout << best_building << endl;
	return 0;
}