# -*- coding: utf-8 -*-
# import bisect
# import heapq
# import math
# import random
# from collections import Counter, defaultdict, deque
# from decimal import ROUND_CEILING, ROUND_HALF_UP, Decimal
# from functools import lru_cache, reduce
# from itertools import combinations, combinations_with_replacement, product, permutations
# from operator import add, mul, sub
import sys
# sys.setrecursionlimit(10**6)
# buff_readline = sys.stdin.buffer.readline
buff_readline = sys.stdin.readline
readline = sys.stdin.readline
INF = 2**62-1
def read_int():
return int(buff_readline())
def read_int_n():
return list(map(int, buff_readline().split()))
def read_float():
return float(buff_readline())
def read_float_n():
return list(map(float, buff_readline().split()))
def read_str():
return readline().strip()
def read_str_n():
return readline().strip().split()
def error_print(*args):
print(*args, file=sys.stderr)
def mt(f):
import time
def wrap(*args, **kwargs):
s = time.time()
ret = f(*args, **kwargs)
e = time.time()
error_print(e - s, 'sec')
return ret
return wrap
class SegmentTree:
def __init__(self, array, operator, identity_element):
_len = len(array)
self.__op = operator
self.__size = 1 << (_len - 1).bit_length()
self.__tree = [identity_element] * self.__size + \
array + [identity_element] * (self.__size - _len)
self.__ie = identity_element
for i in range(self.__size - 1, 0, -1):
self.__tree[i] = operator(
self.__tree[i * 2], self.__tree[i * 2 + 1])
def update(self, i, v):
i += self.__size
self.__tree[i] = v
while i:
i //= 2
self.__tree[i] = self.__op(
self.__tree[i * 2], self.__tree[i * 2 + 1])
def query(self, l, r):
"""[l, r)
"""
l += self.__size
r += self.__size
ret = self.__ie
while l < r:
if l & 1:
ret = self.__op(ret, self.__tree[l])
l += 1
if r & 1:
r -= 1
ret = self.__op(ret, self.__tree[r])
l //= 2
r //= 2
return ret
@mt
def slv(N, Q, AB, CD):
M = 2*(10**5)
m = [set() for _ in range(M)]
ci = {}
for i, (a, b) in enumerate(AB):
b -= 1
m[b].add(i)
ci[i] = b
fl = [0] * M
st = SegmentTree([INF]*M, min, INF)
for i in range(M):
if len(m[i]) > 0:
f = max(AB[j][0] for j in m[i])
fl[i] = f
st.update(i, f)
for c, d in CD:
c -= 1
d -= 1
cur = ci[c]
ci[c] = d
m[cur].remove(c)
a = AB[c][0]
if a == fl[cur]:
if m[cur]:
f = max(AB[j][0] for j in m[cur])
fl[cur] = f
else:
f = INF
fl[cur] = 0
st.update(cur, f)
m[d].add(c)
if a > fl[d]:
f = a
fl[d] = a
st.update(d, f)
print(st.query(0, M))
# ans = 0
# return ans
def main():
N, Q = read_int_n()
AB = [read_int_n() for _ in range(N)]
CD = [read_int_n() for _ in range(Q)]
(slv(N, Q, AB, CD))
if __name__ == '__main__':
main()