http://www.cppblog.com/MatoNo1/archive/2013/03/03/192131.html
可怕的结论%%%
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
char c;
inline void read(int &a){a=0;do c=getchar();while(c<'0'||c>'9');while(c<='9'&&c>='0')a=(a<<3)+(a<<1)+c-'0',c=getchar();}
int lc[105],rc[105],fa[105],ans[105];
int n,top,root;
void solve()
{
int x=root;
while(rc[x]!=-1)x=lc[x];
int t=lc[x];
if(t!=-1&&lc[t]==-1&&rc[t]==-1)x=t;
ans[++top]=x;
if(x==root)root=lc[root];
int f=fa[x];
if(f!=-1)lc[f]=lc[x],fa[lc[f]]=f;
while(f!=-1)swap(lc[f],rc[f]),f=fa[f];
}
int main()
{
int x;
fa[0]=-1;
memset(lc,-1,sizeof(lc));
memset(rc,-1,sizeof(rc));
read(n);
for(int i=1;i<=n;i++)
{
read(x);
if(x<100)lc[x]=i,fa[i]=x;
else rc[x-100]=i,fa[i]=x-100;
}
for(int i=1;i<=n+1;i++)
solve();
while(top)printf("%d ",ans[top--]);
return 0;
}