Cod sursa(job #812319)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 13 noiembrie 2012 19:34:55
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 3.88 kb
#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)
{
     //   printf("Nodul %d\n",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;
        //printf("%d %d %d %d %d %d %d %d\n",nod,tata[nod],stanga[nod],dreapta[nod],father,tata[father],stanga[father],dreapta[father]);
        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;
        //printf("in subarborele %d avem %d\n",nod,nr_elemente[nod]);
}

void search(int nod,int k)
{
        //printf("%d %d %d\n",nod,k,nr_elemente[nod]);
        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);
                //printf("tatal lui %d este %d\n",i,tata[i]);
                while(sift(i));
                //printf("tatal lui %d este %d\n",i,tata[i]);
                if(!tata[i])
                        radacina = i;
           //     printf("Dupa ce am inserat elementul %d avem:\n",i);
             //   for(int j = 1; j <= n; j++)
               //         printf("%d %d %d %d\n",j,tata[j],stanga[j],dreapta[j]);
        }
    //    printf("ajung\n");
       // for(i = 1; i <= n; i++)
         //       printf("%d %d %d %d %d %d\n",i,tata[i],stanga[i],dreapta[i],v[i], p[i]);
        //for(i = 1; i <= n; i++)
              //  if(!tata[i])
            //    {
        dfs(radacina);
                      //          radacina = i;
                       //         break;
                //}
            //   for(i = 1; i <= n; i++)
              //          printf("%d ",nr_elemente[i]);
                //       printf("\n");

        for(i = 1; i <= n; i++)
                search(radacina,i);
        printf("\n");
        return 0;
}