from bisect import bisect_left,insort ll=[] inf = 10**12+5 n,m,s = [int(x) for x in input().split()] for _ in range(m): a,b = [int(el) for el in input().split()] insort(ll,(a,b)) insort(ll,(-1,inf)) insort(ll,(0,inf)) insort(ll,(inf,inf)) def solve(n,s,ll): idx = bisect_left(ll,(s,inf)) low = ll[idx-1][0] high = ll[idx-1][1] l = idx-2 #po lewej od r = idx # po prawej od ans = inf left_test = True right_test = True while True: if left_test: if (ll[l][1] != low-1): #nie ma łączności if low != 1: #nie jestesmy na skraju if abs(low-1-s) < abs(ans-s): ans = low-1 elif abs(low-1-s) == abs(ans-s): ans = min(low-1,ans) left_test = False left_test = False elif abs(s - ans) < abs(ll[l][0]-1-s): left_test = False else: #update ciagly low = ll[l][0] l -= 1 if right_test: if (ll[r][0] != high+1): if high != n: #nie na skraju if abs(high+1-s) < abs(ans-s): ans = high+1 elif abs(high+1-s) == abs(ans-s): ans = min(high+1,ans) right_test = False elif abs(s - ans) < abs(ll[r][1]+1-s): right_test = False else: high = ll[r][1] r += 1 if not (left_test or right_test): return ans print(solve(n,s,ll))
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 | from bisect import bisect_left,insort ll=[] inf = 10**12+5 n,m,s = [int(x) for x in input().split()] for _ in range(m): a,b = [int(el) for el in input().split()] insort(ll,(a,b)) insort(ll,(-1,inf)) insort(ll,(0,inf)) insort(ll,(inf,inf)) def solve(n,s,ll): idx = bisect_left(ll,(s,inf)) low = ll[idx-1][0] high = ll[idx-1][1] l = idx-2 #po lewej od r = idx # po prawej od ans = inf left_test = True right_test = True while True: if left_test: if (ll[l][1] != low-1): #nie ma łączności if low != 1: #nie jestesmy na skraju if abs(low-1-s) < abs(ans-s): ans = low-1 elif abs(low-1-s) == abs(ans-s): ans = min(low-1,ans) left_test = False left_test = False elif abs(s - ans) < abs(ll[l][0]-1-s): left_test = False else: #update ciagly low = ll[l][0] l -= 1 if right_test: if (ll[r][0] != high+1): if high != n: #nie na skraju if abs(high+1-s) < abs(ans-s): ans = high+1 elif abs(high+1-s) == abs(ans-s): ans = min(high+1,ans) right_test = False elif abs(s - ans) < abs(ll[r][1]+1-s): right_test = False else: high = ll[r][1] r += 1 if not (left_test or right_test): return ans print(solve(n,s,ll)) |