P1177 【模板】快速排序
//动态开点线段树,指针版
#include<bits/stdc++.h>
using namespace std;
const int maxn=100010;
typedef struct node{
int cnt;
node* ls;
node* rs;
}node ;
node* root=NULL;
int cnt(node* rt)
{
if (rt) return rt->cnt;
return 0;
}
void pushup(node *rt)
{
rt->cnt=cnt(rt->ls)+cnt(rt->rs);
}
void insert(node* &rt,int l,int r,int k)
{
if (rt==NULL)
{
rt=new node;
rt->cnt=0;
rt->ls=NULL;
rt->rs=NULL;
}
if (l==r)
{
rt->cnt++;
}
else
{
int mid=l+(r-l)/2;
if (k<=mid)
{
insert(rt->ls,l,mid,k);
}
else
{
insert(rt->rs,mid+1,r,k);
}
pushup(rt);
}
}
void inorder(node* rt,int l,int r)
{
if (rt)
{
int mid=l+(r-l)/2;
inorder(rt->ls,l,mid);
if (rt->ls==NULL&&rt->rs==NULL)
{
for (int i=1;i<=rt->cnt;++i) cout<<l<<" ";
}
inorder(rt->rs,mid+1,r);
}
}
int a[maxn];
int main()
{
int n;
int L,R;
scanf("%d",&n);
scanf("%d",&a[1]);
L=R=a[1];
for (int i=2;i<=n;i++)
{
scanf("%d",&a[i]);
L=min(L,a[i]);
R=max(R,a[i]);
}
for (int i=1;i<=n;i++)
{
insert(root,L,R,a[i]);
}
inorder(root,L,R);
}
/*
5
10 78 89 45 2
*/