Cod sursa(job #1827636)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 12 decembrie 2016 01:19:33
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <cstdio>
#include <cstring>
#define MaxN 500005
#define MaxD 65600
#define MAX 131072
using namespace std;

FILE *IN,*OUT;


int pos=0,fr[MaxD],v[MaxN],aux[MaxN],N,out=0;
inline void Sort()
{
	int Div=1;
	for(int j=1;j<=3;++j)
	{
		memset(fr,0,sizeof fr);
		for(int i=1;i<=N;++i)
			fr[(v[i]/Div)%MaxD]++;
		for(int i=1;i<MaxD;++i)
			fr[i]+=fr[i-1];
		for(int i=N;i>0;--i)
			aux[fr[(v[i]/Div)%MaxD]--]=v[i];
		memcpy(v,aux,sizeof v);
		Div*=MaxD;
	}
}
char f[MAX],Out[MAX],str[10];
inline void Write_Ch(char ch)
{
    Out[out++]=ch;
    if(out==MAX)
        fwrite(Out,MAX,1,OUT),out=0;
}
inline void Write_Int(int nr)
{
    int x=0;
    do
    {
        str[x++]=nr%10+'0';
        nr/=10;
    }
    while(nr);
    while(x>0)
        Write_Ch(str[--x]);
}
inline void Read(int &nr)
{
    nr=0;
    while(f[pos]<'0'||f[pos]>'9')
    {
        pos++;
        if(pos==MAX)
            fread(f,MAX,1,IN),pos=0;
    }
    while(f[pos]>='0'&&f[pos]<='9')
    {
        nr=10*nr+f[pos++]-'0';
        if(pos==MAX)
            fread(f,MAX,1,IN),pos=0;
    }
}
int main()
{
	IN=fopen("algsort.in","r");
    OUT=fopen("algsort.out","w");
	fread(f,1,MAX,IN);
	Read(N);
	for(int i=1;i<=N;++i)
		Read(v[i]);
	Sort();
	for(int i=1;i<=N;++i)
		Write_Int(v[i]),Write_Ch(' ');
	
    if(out>0)fwrite(Out,1,out,OUT);
	return 0;
}