Cod sursa(job #2233063)

Utilizator mateibanuBanu Matei Costin mateibanu Data 22 august 2018 01:59:07
Problema Sortare prin comparare Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <stdio.h>
#include <vector>

using namespace std;

#define ll long long

vector<ll>l[500010];
vector<ll>aux;
void mergi(ll x,ll y){
    ll i,j;
    ll n=l[x].size();
    ll m=l[y].size();
    i=0;j=0;
    while (i<n||j<m){
        if (i<n&&j<m){
            if (l[x][i]<l[y][j]){
                aux.push_back(l[x][i]);
                i++;
            }
            else{
                aux.push_back(l[y][j]);
                j++;
            }
        }
        else
        if (i<n){
            aux.push_back(l[x][i]);
            i++;
        }
        else if (j<m){
            aux.push_back(l[y][j]);
            j++;
        }
        }
        l[x].clear();
        l[y].clear();
        for (i=0;i<=n+m;i++) l[x].push_back(aux[i]);
        aux.clear();
}

int main()
{
    ll n,x,i,j;
    freopen("algsort.in","r",stdin);
    freopen("algsort.out","w",stdout);
    scanf("%lld",&n);
    for (i=1;i<=n;i++) {
        scanf("%lld",&x);
        l[i].push_back(x);
    }
    for (i=2;i<=n;i*=2)
    for (j=i;j<=n;j+=i){
        mergi(j,j-i/2);
    }
    i/=2;
    if (i<n){
        j=i;
        i/=2;
        while (j<n){
            if (j+i<=n){
                j+=i;
                mergi(j,j-i);
            }
            i/=2;
        }
    }
    j=l[n].size();
    for (i=0;i<n;i++) printf("%lld ",l[n][i]);
    return 0;
}