Загрузка данных


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)