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
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <algorithm>
using namespace std;

int main(void){
    long long int n, m, s, l, r;
    long long int min_dist;
    long long int dist, picked_number;
    long long int before, after;
    vector<vector<long long int> > vec;
    scanf("%lld %lld %lld", &n, &m, &s);
    min_dist = n;
    vec.resize(m);
    for(long long int i = 0; i < m; i++){
        vec[i].resize(2);
        scanf("%lld %lld", &l, &r);
        vec[i][0] = l;
        vec[i][1] = r;
    }
    //posortuj rosnąco
    sort(vec.begin(), vec.end(), [](const vector<long long int> &a, const vector<long long int> &b){
        return a[0] < b[0];
    });

    //wybierz najbliższy budynek do szkoły
    if(vec[0][0]-1 >= 1) {
        picked_number = vec[0][0]-1;
        min_dist = abs(s - picked_number);
    }
    for(long long int i = 0; i < m; i++){
        //sprawdź czy budynek przed przedziałem jest wolny
        if(i>0 && vec[i-1][1]+1 != vec[i][0]){
            if(abs(s-(vec[i][0]-1)) < min_dist){
                min_dist = abs(s-(vec[i][0]-1));
                picked_number = vec[i][0]-1;
            }
        }
        //sprawdź czy budynek po przedziale jest wolny
        if(i < m-1 && vec[i][1]+1 != vec[i+1][0]){
            if(abs(s-(vec[i][1]+1)) < min_dist){
                min_dist = abs(s-(vec[i][1]+1));
                picked_number = vec[i][1]+1;
            }
        }
    }
    //zobacz jeszcze czy da się wybrać budynek za ostatnim przedziałem
    //printf("%lld\n ", vec[m-1][1]+1);
    if(vec[m-1][1]+1<=n && abs(s-(vec[m-1][1]+1)) < min_dist){
        min_dist = abs(s-(vec[m-1][1]+1));
        picked_number = vec[m-1][1]+1;
    }
    printf("%lld\n", picked_number);
    return 0;
}