Pagini recente » Cod sursa (job #1576626) | Cod sursa (job #622713) | Cod sursa (job #333058) | Cod sursa (job #2298995) | Cod sursa (job #2088271)
#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];
}
}