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 <cstdio>

using namespace std;

int main()
{
    long long n = 0,s = 0;
    int m = 0;
    scanf("%lld%d%lld", &n, &m, &s);
    long long tab[m][2] = {0};
    int count = 0;
    for(int i = 0; i < m; i++){
        long long l,r;
        scanf("%lld%lld", &l, &r);
        if(count == 0){
            tab[0][0] = l;
            tab[0][1] = r;
            count++;
            continue;
        }
        for(int j = 0; j < count; j++){
            if(tab[j][0] - 1 == r){
                tab[j][0] = l;
                l = -1;
                r = -1;
                break;
            }
            else if(tab[j][1] + 1 == l){
                tab[j][1] = r;
                l = -1;
                r = -1;
                break;
            }
        }
        if(l != -1 && r != -1){
            tab[count][0] = l;
            tab[count][1] = r;
            count++;
        }
    }
    long long leftPointer = s - 1;
    long long rightPointer = s + 1;
    long long distance = n;
    long long answer = n;
    while(true){
        bool leftIn = false;
        bool rightIn = false;
        for(int i = 0; i < count; i++){
            if(leftPointer > 0 && leftPointer >= tab[i][0] && leftPointer <= tab[i][1]){
                leftPointer = tab[i][0] - 1;
                if(s - leftPointer > distance){
                    printf("%lld", answer);
                    return 0;
                }
                leftIn = true;
            }
            if(rightPointer <= n && rightPointer >= tab[i][0] && rightPointer <= tab[i][1]){
                rightPointer = tab[i][1] + 1;
                if(rightPointer - s > distance){
                    printf("%lld", answer);
                    return 0;
                }
                rightIn = true;
            }
        }
        if(!leftIn && leftPointer != -1 && leftPointer != 0){
            if(s - leftPointer < distance){
                distance = s - leftPointer;
                answer = leftPointer;
            }
            else if(s - leftPointer == distance && answer > leftPointer){
                answer = leftPointer;
            }
            leftPointer = -1;
        }
        if(!rightIn && rightPointer != -1 && leftPointer <= n){
            if(rightPointer - s < distance){
                distance = rightPointer - s;
                answer = rightPointer;
            }
            else if(rightPointer - s == distance && answer > rightPointer){
                answer = rightPointer;
            }
            rightPointer = -1;
        }
        if(leftPointer == rightPointer){
            printf("%lld", answer);
            return 0;
        }
    }
    return 0;
}