构建笛卡尔树.
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 55000;
int fa[maxn],lc[maxn],rc[maxn];
struct node
{
int num,key,val,f,l,r;
} dt[maxn];
bool Cmp(node a, node b)
{
return a.key < b.key;
}
void Insert(int i)
{
int j = i - 1;
while(dt[j].val > dt[i].val) j = dt[j].f;
dt[i].l = dt[j].r;
dt[dt[j].r].f = i;
dt[i].f = j;
dt[j].r = i;
}
void Dfs(int i)
{
if(i)
{
Dfs(dt[i].l);
fa[dt[i].num] = dt[dt[i].f].num;
lc[dt[i].num] = dt[dt[i].l].num;
rc[dt[i].num] = dt[dt[i].r].num;
Dfs(dt[i].r);
}
}
int main()
{
int n;
scanf("%d",&n);
for(int i = 1; i <= n; ++i)
{
dt[i].num = i;
scanf("%d %d",&dt[i].key,&dt[i].val);
dt[i].f = dt[i].l = dt[i].r = 0;
}
dt[0].f = dt[0].l = dt[0].r =dt[0].key = dt[0].num = 0;
dt[0].val = -999999;
sort(dt+1,dt+n+1,Cmp);
//for(int i =1; i <= n; ++i)
//printf("%d %d\n",dt[i].key,dt[i].val);
for(int i = 1; i<= n; ++i)
Insert(i);
Dfs(dt[0].r);
printf("YES\n");
for(int i = 1; i <=n; ++i)
printf("%d %d %d\n",fa[i],lc[i],rc[i]);
return 0;
}