#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;
}
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; } |
English