1064. Complete Binary Search Tree (30)
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
class CA
{
public:
enum{N=1100};
void run();
int getroot(int l,int r);
int ar[N],n;
};
int CA::getroot(int l,int r)
{
int c=r-l+1,c1,jc;
if(c<=0) return -1;
if(c==1) return l;
c1=c+1;
while((c1&(c1-1))!=0) c1++;
jc=c1/4-(c1-1-c);
if(jc>=0) return l+(c1/2-1);
else return l+(c1/2-1)+jc;
}
void CA::run()
{
queue<pair<int,int> > q;
pair<int,int> pi;
scanf("%d",&n);
int i,r;
for(i=0;i<n;i++) scanf("%d",ar+i);
sort(ar,ar+n);
r=getroot(0,n-1);
if(r>=0)
{
printf("%d",ar[r]);
q.push(pair<int,int>(0,r-1));
q.push(pair<int,int>(r+1,n-1));
}
while(!q.empty())
{
pi=q.front();q.pop();
r=getroot(pi.first,pi.second);
if(r>=0)
{
printf(" %d",ar[r]);
q.push(pair<int,int>(pi.first,r-1));
q.push(pair<int,int>(r+1,pi.second));
}
}
}
int main()
{
// freopen("test.in","r",stdin);
CA *a=new CA;
a->run();
return 0;
}