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
#include <bits/stdc++.h>

using namespace std;

int main()
{
    //char buffer[500];
    ios_base::sync_with_stdio(0);
    cin.tie(nullptr);
    cout.tie(nullptr);

    long long int n, s;
    int m;

    //fgets(buffer, sizeof(buffer), stdin);
    //sscanf(buffer, " %lld %d %lld ", &n, &m, &s);

    cin>>n>>m>>s;

    vector<pair<long long int, long long int>> ranges(m);

    bool is_s_taken = false;
    for (int i = 0; i < m; i++)
    {
        //fgets(buffer, sizeof(buffer), stdin);
        //sscanf(buffer, " %lld %lld ", &ranges[i].first, &ranges[i].second);

        cin>>ranges[i].first>>ranges[i].second;

        /*if(ranges[i].first <= s && ranges[i].second >= s)
        {
            is_s_taken = true;
        }*/
    }

    //if(!is_s_taken) { ranges.emplace_back(s,s); }

    sort(ranges.begin(), ranges.end());

    long long int optimum=ranges[0].first - 1; // sprawdzac potem czy nie 0
    long long int optimum_distance = abs(s - optimum);
    long long int distance_from_school, curr_house;

    for (int i = 1; i < ranges.size(); i++)
    {
        while(i < ranges.size() && ranges[i-1].second + 1 == ranges[i].first)
        {
            ++i;
        }
        if(i >= ranges.size()) { break; }

        if(abs(s - (ranges[i].first - 1)) < abs(s - (ranges[i-1].second + 1)))
        {
            curr_house = ranges[i].first - 1;
        }
        else
        {
            curr_house = ranges[i-1].second + 1;
        }

        distance_from_school = abs(s - curr_house);

        if(optimum_distance > distance_from_school || optimum <= 0)
        {
            optimum = curr_house;
            optimum_distance = distance_from_school;
        }
    }

    long long int last = ranges.back().second + 1;
    if(optimum <= 0 || (abs(last - s) < optimum_distance && last <= n))
    {
        optimum = last;
    }

    //printf("%lld\n", optimum);
    cout << optimum << endl;

    return 0;
}