左偏树
作者:
东边的西瓜皮
,
2022-09-05 23:42:06
,
所有人可见
,
阅读 217
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5+10;
int l[N],r[N],val[N],dist[N];
int merge(int x,int y){
if(!x||!y)return x|y;
if(val[x]>val[y])swap(x,y);
r[x]=merge(r[x],y);
if(dist[r[x]]>dist[l[x]])swap(r[x],l[x]);
dist[x]=dist[r[x]]+1;
return x;
}
int main()
{
int n,m;
cin>>n>>m;
cin>>val[1];
int root=1;
for(int i=2;i<=n;i++){
cin>>val[i];
root=merge(root,i);
}
for(int i=0;i<m;i++){
cout<<val[root]<<' ';
root=merge(l[root],r[root]);
}
return 0;
}