Cod sursa(job #1992830)

Utilizator ajeccAjechiloae Eugen ajecc Data 21 iunie 2017 15:41:59
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
#include <bits/stdc++.h>
#define for0(i, n) for(int i = 0; i < n; i++)
#define for1(i, n) for(int i = 1; i <= n; i++)
#define pb push_back
#define mp make_pair
#define all(v) v.begin(), v.end()
#define V vector<int>
#define VP vector<pair<int, int> >
#define clr(A, x) memset(A, x, sizeof(A))
#define cpy(A, B) memcpy(A, B, sizeof(B))
#define g(s) getline(cin, s) ///ai grija la fin/cin ///
#define FASTIO ios_base::sync_with_stdio(0)
const long long INFLL = 2 * 1e18 + 100;
const int INFINT = 2 * 1e9 + 100;
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
ifstream fin("algsort.in");
ofstream fout("algsort.out");
void die()
{
    cout << "-1";
    exit(0);
}
const int NMAX = 1e6 + 5;
const int MOD = 1e9 + 7; /// careful here (7 or 9, 66.. etc)
const double PI = atan(1) * 4;
const double EPS = 1e-12;


void manual_merge(V &v, int l, int m, int r)
{
    V L, R;

    for(int i = l; i <= m; i++)
        L.pb(v[i]);
    for(int i = m + 1; i <= r; i++)
        R.pb(v[i]);

    int i = 0, j = 0, index = l;

    while(i < L.size() && j < R.size())
    {
        if(L[i] <= R[j])
        {
            v[index] = L[i];
            i++;
        }
        else
        {
            v[index] = R[j];
            j++;
        }

        index++;
    }
    while(i < L.size())
    {
        v[index] = L[i];
        i++;
        index++;
    }
    while(j < R.size())
    {
        v[index] = R[j];
        j++;
        index++;
    }
}

void merge_sort(V &v, int l, int r)
{
    if(l < r)
    {
        int m = (l + r) / 2;

        merge_sort(v, l, m);
        merge_sort(v, m + 1, r);

        manual_merge(v, l, m, r);
    }
}

int n;
V v;

int main()
{
    FASTIO;
    fin >> n;
    for1(i, n)
    {
        int a;
        fin >> a;
        v.pb(a);
    }
    merge_sort(v, 0, v.size() - 1);
    for(auto i: v) fout << i << ' ';

    return 0;
}