Cod sursa(job #2049131)

Utilizator MaligMamaliga cu smantana Malig Data 26 octombrie 2017 21:26:14
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>
#include <algorithm>
#include <queue>

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 = 1e7 + 5;
const int inf = 1e9 + 5;

int N,root;
int v[NMax],sorted[NMax],batog[NMax];

void update(int,int);
int query(int,int);

int main() {
    in>>N;

    root = 1;
    for (;root*root <= N;++root) ;
    --root;

    //cout<<root<<"\n\n";

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

        int idx = (i-1) / root + 1;
        if (v[batog[idx]] < v[i]) {
            batog[idx] = i;
        }
    }

    /*
    for (int i=1;i*root <= N;++i) {
        cout<<batog[i]<<' '<<v[batog[i]]<<'\n';
    }
    //*/

    for (int c=N;c > 0;--c) {
        int idx = query(1,N);
        //cout<<idx<<'\n';
        sorted[c] = v[idx];
        update(idx,-1);
    }

    for (int i=1;i <= N;++i) {
        out<<sorted[i]<<' ';
    }

    in.close();out.close();
    return 0;
}

void update(int i,int val) {
    int idx = (i-1)/root + 1,
        st = (idx-1)*root + 1,
        dr = idx*root;

    batog[idx] = 0;
    v[i] = val;
    for (int j=st;j <= dr;++j) {

        if (v[batog[idx]] < v[j]) {
            batog[idx] = j;
        }
    }
}

int query(int a,int b) {
    int ans = 0;

    int j = a;
    while ((j-1) % root != 0 && j <= b) {
        if (v[ans] < v[j]) {
            ans = j;
        }

        ++j;
    }

    while (j+root-1 <= b) {
        int idx = (j-1)/root + 1;
        if (v[ans] < v[ batog[idx] ]) {
            ans = batog[idx];
        }

        j += root;
    }

   while (j <= b) {
        if (v[ans] < v[j]) {
            ans = j;
        }

        ++j;
   }

   return ans;
}