Cod sursa(job #2311074)

Utilizator NToniBoSSNicolae Tonitza NToniBoSS Data 2 ianuarie 2019 16:37:52
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <bits/stdc++.h>
#define LIM 1<<17
/// TONI BO$$ was here
/// #MLC

using namespace std;
char BUF[LIM];
int poz;

char getCh()
{
    poz++;
    if(poz>=LIM)
    {
        fread(BUF,LIM,1,stdin);
        poz=0;
    }
    return BUF[poz];
}

int getNr()
{
    int nr=0,semn=1;
    char c=getCh();
    while(!isdigit(c) && c!='-')
        c=getCh();
    if(c=='-')
    {
        c=getCh();
        semn=-1;
    }
    while(isdigit(c))
    {
        nr=nr*10+c-'0';
        c=getCh();
    }
    return nr*semn;
}

int v[500001];

void mergesort(int p,int u)
{
    if(p>=u)
        return ;
    int mid=(p+u)/2;
    mergesort(p,mid);
    mergesort(mid+1,u);
    int i,j,ct;
    vector <int> aux(u-p+1);
    i=p;
    j=mid+1;
    ct=0;
    while(i<=mid && j<=u)
    {
        if(v[i]<=v[j])
            aux[ct++]=v[i++];
        else
            aux[ct++]=v[j++];
    }
    while(i<=mid)
       aux[ct++]=v[i++];
    while(j<=u)
        aux[ct++]=v[j++];
    for(i=p; i<=u; i++)
        v[i]=aux[i-p];
}

int main()
{
    int i,n;
    freopen("algsort.in","r",stdin);
    freopen("algsort.out","w",stdout);
    n=getNr();
    for(i=1; i<=n; i++)
        v[i]=getNr();
    mergesort(1,n);
    for(i=1; i<=n; i++)
        printf("%d ",v[i]);

    return 0;
}