n = int(input())
data = []
for _ in range(n):
x, y = map(int, input().split())
data.append((x, y))
# Сортируем по признаку
data.sort(key=lambda v: v[0])
# Весь массив по признакам
xs = [d[0] for d in data]
ys = [d[1] for d in data]
# Предварительно считаем общеметочную статистику
total_ones = sum(ys)
total_zeros = n - total_ones
# Перебор возможных порогов – между соседними x_i
max_diversity = -1
best_t = None
# Для вычисления мер удобно проходить последовательно и обновлять аккумулированные данные
left_ones = 0
left_size = 0
# Проходим по всем точкам, чтобы рассматривать разделение между ними
for i in range(n - 1):
# Добавляем текущий элемент в левую часть
if ys[i] == 1:
left_ones += 1
left_size += 1
# Значение признака
x_curr = xs[i]
x_next = xs[i + 1]
# Порог t — это любое целое число между x_curr и x_next
# Рассмотрим порог, равный x_curr (или x_next), и, для защиты,
# возьмем порог в между ними, например t = x_curr
# или т= x_next, но по условию выбираем минимальный t
# чтобы упростить, возьмем t = x_curr (указывать t как x_curr)
t = x_curr
# Можно рассматривать только t = x_curr (самый маленький, чтобы разделить)
n_left = left_size
n_right = n - n_left
if n_left == 0 or n_right == 0:
continue # разделение не делается, пропустим
# доли класса 1
p_left = left_ones / n_left
p_right = (total_ones - left_ones) / n_right
# мер разнообразия
delta_left = n_left * p_left * (1 - p_left)
delta_right = n_right * p_right * (1 - p_right)
dsplit = delta_left + delta_right
if dsplit > max_diversity or (abs(dsplit - max_diversity) < 1e-12 and (best_t is None or t < best_t)):
max_diversity = dsplit
best_t = t
# В случае, если max_diversity осталось равным -1 значит, что все y одинаковы, или разделение не изменяет ничего.
# Тогда можно выбрать минимальный т
if best_t is None:
best_t = xs[0]
print(best_t)