这个数据结构看上去非常巧妙,不过没有找到实用的例题。。。。
#include<iostream>
#include<cstdio>
#include<algorithm>
#define maxn 50005
using namespace std;
struct Pair
{
int key,aux,id;
int fa,ch[2];
void print()
{printf("%d %d %d\n",fa,ch[0],ch[1]);}
}p[maxn];
bool cmp(Pair A,Pair B)
{return A.key<B.key;}
bool cmp2(Pair A,Pair B)
{return A.id<B.id;}
int S[maxn],top;
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
read(p[i].key);
read(p[i].aux);
p[i].id=i;
}
sort(p+1,p+n+1,cmp);
for(int i=1;i<=n;i++)
{
while(top)
{
if(p[S[top]].aux<p[i].aux)
break;
top--;
}
int f=S[top];
int t=p[f].ch[1];
p[f].ch[1]=i;
p[i].fa=f;
p[t].fa=i;
p[i].ch[0]=t;
S[++top]=i;
}
for(int i=1;i<=n;i++)
{
int x=p[i].fa;p[i].fa=p[x].id;
x=p[i].ch[0];p[i].ch[0]=p[x].id;
x=p[i].ch[1];p[i].ch[1]=p[x].id;
}
sort(p+1,p+n+1,cmp2);
puts("YES");
for(int i=1;i<=n;i++)
p[i].print();
return 0;
}