Pagini recente » Cod sursa (job #2294291) | Cod sursa (job #2061632) | Cod sursa (job #2625154) | Cod sursa (job #2087417) | Cod sursa (job #2049131)
#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;
}