键值二元组(u,v)
笛卡尔树有以下性质
u满足二叉搜索树的性质
v满足堆性质
中序遍历得原序列
/*input
11
9 3 7 1 8 12 10 20 15 18 5
*/
#include<iostream>
using namespace std;
const int N=100;
int a[N];
int ls[N],rs[N],st[N],top=0;
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++)
{
while(top&&a[st[top]]>=a[i]) ls[i]=st[top--];
if(top) rs[st[top]]=i;
st[++top]=i;
}
for(int i=1;i<=n;i++) {
cout<<a[i]<<' '<<a[ls[i]]<<' '<<a[rs[i]]<<endl;
}
cout<<a[st[1]]<<endl;
}
/*
9 0 0
3 9 7
7 0 0
1 3 5
8 0 10
12 0 0
10 12 15
20 0 0
15 20 18
18 0 0
5 8 0
1
*/