Pagini recente » Cod sursa (job #2292372) | Cod sursa (job #1160007) | Cod sursa (job #1048643) | Cod sursa (job #907421) | Cod sursa (job #1824896)
#include <iostream>
#include <fstream>
#include <algorithm>
#define NMAX 500001
#define INF ((1LL << 32) - 1)
using namespace std;
ifstream in("algsort.in");
ofstream out("algsort.out");
unsigned int AINT[4 * NMAX];
void Update(int node, int st, int dr, int poz, unsigned int key)
{
if (st == dr)
AINT[node] = key;
else
{
int mid = st + (dr - st) / 2;
if (poz <= mid)
Update(2 * node, st, mid, poz, key);
if (poz > mid)
Update(2 * node + 1, mid + 1, dr, poz, key);
AINT[node] = min(AINT[2 * node], AINT[2 * node + 1]);
}
}
int find(int node, int st, int dr, unsigned int key)
{
int mid;
while (st != dr)
{
mid = st + (dr - st) / 2;
if (AINT[2 * node] == key)
{
node = node * 2;
dr = mid;
}
else if (AINT[2 * node + 1] == key)
{
node = node * 2 + 1;
st = mid + 1;
}
}
return st;
}
int main()
{
int n;
in >> n;
int x;
for (int i = 1; i <= n; i++)
{
in >> x;
Update(1, 1, n, i, x);
}
while (AINT[1] != INF)
{
out << AINT[1] << " ";
x = find(1, 1, n, AINT[1]);
Update(1, 1, n, x, INF);
}
in.close();
out.close();
return 0;
}