# IF문 좀 대신 써줘 import sys input = sys.stdin.readline def binary_search(target, badge): l, r = 0, len(badge) while l < r: mid = (l+r)//2 if badge[mid][1] >= target: r = mid else: l = mid + 1 return l def solution(): n, m = map(int, input().rstrip().split()) badge = [] name, value = input().rstrip().split() badge.append((name, int(value))) for i in range(n-1): name, value = input().rstrip().split() if badge[-1][1] == int(value): continue badge.append((name, int(value))) for i in range(m): target = int(input().rstrip()) idx = binary_search(target, badge) print(badge[idx][0]) return solution() """ 걸린 시간: 7:07~ 시간 복잡도: 해설: 문제가 너무 단순해서 뭔가 했는데 n, m <= 10^5 이기 때문에 n에서 비교를 최대한 줄이는 것이 핵심이다. n으로 만들어진 수직선 상에 m이 들어갈 위치를 찾으면 되기 때문에 이분탐색으로 진행한다. 10^5는 17정도에서 끝낼 수 있다. badge에 상한 값이 겹치는 애들은 첫번째만 넣고, m개 받으면서 이분탐색 진행 이분탐색 정리했는데 자꾸 헷갈리니까 다시 정리 내가 찾고자 하는건 badge의 idx이다. 즉 mid 기준으로 생각하는게 편하다. 지금 문제는 target이 어느 상한에 속하나인데, 100이라면 100이상의 상한을 찾아서 가장 먼저 나오는 상한값이 답인 것이다. 따라서 badge[mid][1] >= target으로 기본을 잡으면 되고, 저게 성립하면 mid는 답이 될 수 있지만 왼쪽에 답이 있을 수도 있다. 따라서 r을 움직여야하고, 현재 mid를 포함한 값이 되야 한다. r = mid 반대 상황은 badge가 target보다 작은거니까 현재 mid가 답이 될 수 없으므로 l = mid + 1 원소의 유무 판단이 아닌 들어갈 곳 찾기기 때문에 l, r = 0, len(badge)로 한다. while문 기본 조건은 들어갈 자리를 찾는 것이기 때문에 l = r일때는 알아보는 것이 의미 없다. 따라서 while l < r 끝. """