Pagini recente » Cod sursa (job #772296) | Cod sursa (job #3139484) | Cod sursa (job #1236296) | Cod sursa (job #1364509) | Cod sursa (job #1826562)
//Arbori de intervale - Sortare
#include <fstream>
using namespace std;
ifstream fin("algsort.in");
ofstream fout("algsort.out");
#define DMAX 500001
#define infinit ((1LL << 32) - 1)
long long N;
long long v[DMAX];
long long ArbInt[DMAX*4];
void update(int nod, int st, int dr, int poz, int val) {
if(st == dr) {
ArbInt[nod] = val;
return;
}
int mid = (st + dr)/2;
if(poz <= mid)
update(2*nod, st, mid, poz, val);
else
update(2*nod + 1, mid + 1, dr, poz, val);
ArbInt[nod] = min(ArbInt[2*nod], ArbInt[2*nod + 1]);
}
/*
int query(int nod, int st, int dr, int val) {
int mid;
while(st != dr) {
mid = (st + dr)/2;
if(ArbInt[2*nod] == val) {
nod = 2*nod;
dr = mid;
}
else if(ArbInt[2*nod + 1] == val) {
nod = 2*nod + 1;
st = mid + 1;
}
}
}
*/
int main()
{
long long i;
long long l, r, m, node;
fin>>N;
for(i = 1 ; i <= N ; i++) {
fin>>v[i];
update(1, 1, N, i, v[i]);
}
for(i = 1 ; i <= N ; i++) {
fout<<ArbInt[1]<<" ";
l = 1, r = N, node = 1;
while(l != r) {
m = (l + r)/2;
if(ArbInt[2*node] == ArbInt[1]) {
node *= 2;
r = m;
}
else {
node = 2*node + 1;
l = m + 1;
}
}
update(1, 1, N, l, INT_MAX);
}
fin.close();
fout.close();
return 0;
}