Cod sursa(job #829373)

Utilizator maritimCristian Lambru maritim Data 5 decembrie 2012 11:16:34
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include<stdio.h>

FILE *f = fopen("algsort.in","r");
FILE *g = fopen("algsort.out","w");

#define MaxN 1200100
#define INF ((1<<31)-1)
#define mij ((li+ls)>>1)
#define fs (poz<<1)
#define fd ((poz<<1)+1)

int N;
int A[MaxN],AINT[MaxN];

inline int min(int a,int b)
{
    return a < b ? a : b;
}

inline int pozAINT(int li,int ls,int poz)
{
    if(li == ls)
        return li;

    if(AINT[poz] == AINT[poz<<1])
        return pozAINT(li,mij,poz<<1);
    else
        return pozAINT(mij+1,ls,(poz<<1)+1);
}

inline void build(int li,int ls,int poz)
{
    if(li == ls)
    {
        AINT[poz] = A[li];
        return ;
    }

    build(li,mij,fs);
    build(mij+1,ls,fd);

    AINT[poz] = min(AINT[fs],AINT[fd]);
}

inline void insertAINT(int li,int ls,int poz,int poz2,int val)
{
    if(li == ls)
    {
        AINT[poz] = val;
        return ;
    }

    if(poz2 <= mij)
        insertAINT(li,mij,poz<<1,poz2,val);
    else
        insertAINT(mij+1,ls,(poz<<1)+1,poz2,val);

    AINT[poz] = min(AINT[poz<<1],AINT[(poz<<1)+1]);
}

void citire(void)
{
    fscanf(f,"%d",&N);
    for(int i=1;i<=N;i++)
        fscanf(f,"%d",&A[i]);
}

void sortare(void)
{
    build(1,N,1);

    for(int i=1;i<=N;i++)
    {
        fprintf(g,"%d ",AINT[1]);
        insertAINT(1,N,1,pozAINT(1,N,1),INF);
    }
}

int main()
{

    citire();
    sortare();
}