#P5592. POJ2201 Cartesian Tree笛卡尔树
POJ2201 Cartesian Tree笛卡尔树
Description
有一种特殊的二叉树被称为笛卡尔树,这种二叉树的每个结点都有两个关键码,记为key1和key2。
现在给你一组关键码,每组关键码用二个整数表示,要求构造一棵同时满足下列两个性质的笛卡尔树:
只考虑这棵笛卡尔树的第一关键码,它是一棵排序二叉树。
只考虑这棵笛卡尔树的第二关键码,它们满足类似于最小堆的性质,即任意一个父结点的第二关键码都比它的子结点的第二关键码小。
Format
Input
输入文件的第一行包含一个整数N(1<=N<=50000),表示要构造的笛卡尔树的结点数。 接下来的N行每行包含两个用空格隔开的整数k1和k2,其中│k1│<=30000,│k2│<=30000, 表示笛卡尔树的一个结点的两个关键码, 可以保证没有两个结点的第一关键码会相等,也没有两个结点的第二关键码会相等。
Output
如果用输入文件中给出的所有结点不能构造一棵满足条件的笛卡尔树, 你只须输出单独的一行"NO";否则输出文件的第一行应输出"YES", 在接下来的N行中输出这棵笛卡尔树的构造方案, 每一行输出三个整数, 相邻两个整数严格用一个空格隔开,分别表示相应结点的父结点编号、左子结点编号和右子结点编号, 若没有父结点或左右子结点则一律用0表示。
Samples
7
5 4
2 2
3 9
0 5
1 3
6 6
4 11
YES
2 3 6
0 5 1
1 0 7
5 0 0
2 4 0
1 0 0
3 0 0