Pagini recente » Cod sursa (job #679769) | Cod sursa (job #330279) | Cod sursa (job #800710) | Cod sursa (job #496539) | Cod sursa (job #812321)
Cod sursa(job #812321)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define NMAX 500006
int n,tata[NMAX],stanga[NMAX],dreapta[NMAX],p[NMAX];
int nr_elemente[NMAX],v[NMAX],radacina;
void insert(int nod,int nod_nou)
{
if(nod == nod_nou)
return ;
if(v[nod_nou] < v[nod])
{
if(!stanga[nod])
{
tata[nod_nou] = nod;
stanga[nod] = nod_nou;
}
insert(stanga[nod], nod_nou);
}
else
{
if(!dreapta[nod])
{
tata[nod_nou] = nod;
dreapta[nod] = nod_nou;
}
insert(dreapta[nod], nod_nou);
}
}
inline int sift(int nod)
{
if(!tata[nod] || p[nod] <= p[tata[nod]])
return 0;
int father = tata[nod];
tata[nod] = tata[father];
if(stanga[tata[nod]] == father)
stanga[tata[nod]] = nod;
else
dreapta[tata[nod]] = nod;
if(stanga[father] == nod)
{
stanga[father] = dreapta[nod];
tata[dreapta[nod]] = father;
dreapta[nod] = father;
}
else
{
dreapta[father] = stanga[nod];
tata[stanga[nod]] = father;
stanga[nod] = father;
}
tata[father] = nod;
return 1;
}
void dfs(int nod)
{
if(!nod)
return ;
dfs(stanga[nod]);
//printf("%d ", v[nod]);
dfs(dreapta[nod]);
nr_elemente[nod] = nr_elemente[stanga[nod]] + nr_elemente[dreapta[nod]] + 1;
}
void search(int nod,int k)
{
if(k == nr_elemente[stanga[nod]] + 1)
{
printf("%d ",v[nod]);
return ;
}
if(nr_elemente[stanga[nod]] < k)
search(dreapta[nod], k - nr_elemente[stanga[nod]] - 1);
else search(stanga[nod],k);
}
int main ()
{
int i;
freopen("algsort.in","r",stdin);
freopen("algsort.out","w",stdout);
srand(time(0));
scanf("%d",&n);
for(i = 1; i <= n; i++)
scanf("%d",&v[i]);
for(i = 1; i <= n; i++)
p[i] = rand() % 1000000000;
for(i = 2; i <= n; i++)
tata[i] = -1;
radacina = 1;
for(i = 2; i <= n; i++)
{
insert(radacina,i);
while(sift(i));
if(!tata[i])
radacina = i;
}
dfs(radacina);
for(i = 1; i <= n; i++)
search(radacina,i);
printf("\n");
return 0;
}