Cod sursa(job #2088271)

Utilizator BogdanisarBurcea Bogdan Madalin Bogdanisar Data 14 decembrie 2017 21:43:16
Problema Sortare prin comparare Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include <iostream>
#include <fstream>
#include <iomanip>
#include <cmath>
#include <vector>
#include <queue>
#include <algorithm>

#if 1
#define pv(x) cout<<#x<<" = "<<x<<"; ";cout.flush()
#define pn cout<<endl
#else
#define pv(x)
#define pn
#endif

using namespace std;
ifstream in("algsort.in");
ofstream out("algsort.out");

#define ll long long
#define ull unsigned long long
#define pb push_back
#define mp make_pair
const int NMax = 5e5 + 5;
const int arbMax = 1048575;
const unsigned inf = 4e9 + 50;

int N,M;
unsigned aint[arbMax],v[NMax];
// aint[i] = un index din intervalul [st,dr] aferent nodului i, astfel incat v[index] este valoarea minima din interval;

void update(unsigned,unsigned,unsigned,unsigned);

int main() {
    in>>N;
    for (int i=1;i <= N;++i) {
        in>>v[i];

        update(1,1,N,i);
    }

    for (int i=1;i <= N;++i) {
        int idx = aint[1]; // pozitia minimului;

        out<<v[idx]<<' ';

        // se elimina minimul;
        v[idx] = inf;
        update(1,1,N,idx);
    }

    return 0;
}

// functia update seteaza frunzele si recalculeaza aint[i] pentru toate nodurile
// care au idx in intervalul aferent;
void update(unsigned node,unsigned st,unsigned dr,unsigned idx) {
    int fs = node<<1, ss = fs + 1;

    if (st == dr) {
        aint[node] = idx;
        return;
    }

    unsigned mid = (st+dr)>>1;
    if (idx <= mid) {
        update(fs,st,mid,idx);
    }
    else {
        update(ss,mid+1,dr,idx);
    }

    if (v[aint[fs]] < v[aint[ss]]) {
        aint[node] = aint[fs];
    }
    else {
        aint[node] = aint[ss];
    }
}