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
#include <bits/stdc++.h>
using namespace std;
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    long long n, m, s;
    cin >> n >> m >> s;
    s--;
    vector<pair<long long, long long>> a(m);
    for (int i = 0; i < m; i++)
    {
        long long b, c;
        cin >> b >> c;
        b--;
        c--;
        a[i] = {b, c};
    }
    sort(a.begin(), a.end());
    long long wynik = 0;
    // szukamy najblizszego wolnego miejsca od gory s i od dolu s i wybieramy liczbe mniejsza jesli sa dwa rownoodlegle
    for (int i = 0; i < m; i++)
    {
        if (a[i].first <= s && a[i].second >= s)
        {
            wynik = i;
            break;
        }
    }
    // mamy indeks strefy która zajmuje -> szukamy teraz wolnego miejsca;
    // idziemy w prawo i znajdujemy pierwsze
    long long znalez1 = -1, znalez2 = -1;

    for (int i = wynik; i < m; i++)
    {
        if (i == m - 1 || a[i].second + 1 < a[i + 1].first)
        {
            if (a[i].second + 1 < n)
            {
                znalez1 = a[i].second + 1;
            }
            break;
        }
    }

    for (int i = wynik; i >= 0; i--)
    {
        if (i == 0 || a[i].first - 1 > a[i - 1].second)
        {
            if (a[i].first - 1 >= 0)
            {
                znalez2 = a[i].first - 1;
            }
            break;
        }
    }

    if (znalez1 == -1)
        cout << znalez2 + 1;
    else if (znalez2 == -1)
        cout << znalez1 + 1;
    else if (abs(znalez1 - s) < abs(znalez2 - s))
        cout << znalez1 + 1;
    else if (abs(znalez1 - s) > abs(znalez2 - s))
        cout << znalez2 + 1;
    else
        cout << min(znalez1, znalez2) + 1;
}