Cod sursa(job #2268350)

Utilizator ValentinSavoiuFMI Savoiu Valentin-Marian ValentinSavoiu Data 24 octombrie 2018 18:28:42
Problema Sortare prin comparare Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>// INSERTION SORT + BATOG PENTRU LABORATOR ASD
#include <vector>
#include <queue>
#define NMAX 500001
using namespace std;
ifstream f("algsort.in");
ofstream g("algsort.out");
int a[NMAX], i, N, x, ok, d = 1, pozMin[1001], b[NMAX];
const int infinit = ((1 << 30) - 1) * 2 + 1;
int Querry(int st, int dr) {
    int poz = st;
    while (st % d != 0) {
        if (a[st] < a[poz]) poz = st;
        st++;
    }
    while (st + d <= dr) {
        if (a[pozMin[st / d]] < a[poz]) poz = pozMin[st / d];
        st += d;
    }
    while (st <= dr) {
        if (a[st] < a[poz]) poz = st;
        st++;
    }
    return poz;
}
void Update(int poz, int val) {
    int Bucket = poz / d;
    if(poz == pozMin[Bucket] ) {
        a[poz] = val;
        for(int i = Bucket * d; i < (Bucket + 1) * d; i++)
            if (a[i] < a[pozMin[Bucket]]) pozMin[Bucket] = i;
    }
    else if (val < a[pozMin[Bucket]]) pozMin[Bucket] = poz;
    a[poz] = val;
}
int main() {
    f>>N;
    for (i = 0; i < N; i++) {
        f>>a[i];
    }
    while (d * d <= N) ++d;
    for (i = 0; i < N; i++) {
        if (i % d == 0) pozMin[i / d] = i;
        if (a[i] < a[pozMin[i / d]]) pozMin[i / d] = i;
    }
    for (i = 0; i < N; i++) {
        int poz = Querry(0, N-1);
        b[i] = a[poz];
        Update(poz, infinit);
    }
    for (i = 0; i < N; i++)
        g<<b[i]<<' ';
    return 0;
}