Олимпиадный тренинг

Задача . E. Восстановление дерева


Монокарп нарисовал дерево (неориентированный связный ацикличный граф) и пронумеровал его вершины. Все номера вершин — различные числа от \(1\) до \(n\). Для каждого ребра \(e\) этого дерева он записал два числа: максимальные номера вершин в каждой компоненте, на которые распалось бы дерево, если бы он удалил ребро \(e\) (и только его).

Монокарп дал вам список из \(n - 1\) пар чисел. По этому списку он просит вас определить, существует ли дерево, для которого мог быть записан именно такой список пар, и если оно существует, предоставить пример.

Входные данные

В первой строке содержится одно число \(n\) (\(2 \le n \le 1\,000\)) — количество вершин в дереве.

Каждая из следующих \(n-1\) строк содержит два целых числа \(a_i\) и \(b_i\) (\(1 \le a_i < b_i \le n\)) — максимумы в тех компонентах, на которые распадается дерево при удалении \(i\)-го ребра.

Выходные данные

Если дерево, для которого мог быть получен данный список пар, не существует, выведите «NO» (без кавычек).

Иначе в первой строке выведите «YES» (без кавычек), после чего выведите \(n - 1\) строку с описанием рёбер. В каждой из этих \(n - 1\) строк должны быть записаны два числа \(x_i\) и \(y_i\) (\(1 \le x_i, y_i \le n\)) — номера вершин, соединяемых очередным ребром.

Обратите внимание: несмотря на то, что рёбра пронумерованы, ваш ответ будет засчитан как правильный, если по вашему дереву будет получен список из тех же пар чисел, расположенных в другом порядке. Это значит, что вы можете выводить ребра в любом порядке.

Примечание

Одно из подходящих деревьев для первого примера. Пунктирные линии показывают ребра, при удалении которых получаются соответствующие пары.


Примеры
Входные данныеВыходные данные
1 4
3 4
1 4
3 4
YES
1 3
3 2
2 4
2 3
1 3
1 3
NO
3 3
1 2
2 3
NO

time 1000 ms
memory 256 Mb
Правила оформления программ и список ошибок при автоматической проверке задач

Статистика успешных решений по компиляторам
 Кол-во
С++ Mingw-w645
Комментарий учителя