Pagini recente » Cod sursa (job #2432772) | Cod sursa (job #275384) | Cod sursa (job #3251275) | Cod sursa (job #1201791) | Cod sursa (job #1824900)
#include <iostream>
#include <fstream>
#include <algorithm>
#define NMAX 500001
#define INF ((1LL << 32) - 1)
#define BUFF_SIZE 100000
using namespace std;
ifstream in("algsort.in");
ofstream out("algsort.out");
unsigned int AINT[4 * NMAX];
int pos = 0;
char buff[BUFF_SIZE];
void Read(int &a)
{
while (!isdigit(buff[pos]))
if (++pos == BUFF_SIZE)
in.read(buff, BUFF_SIZE), pos = 0;
a = 0;
while (isdigit(buff[pos]))
{
a = a * 10 + (buff[pos] - '0');
if (++pos == BUFF_SIZE)
in.read(buff, BUFF_SIZE), pos = 0;
}
}
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;
Read(n);
int x;
for (int i = 1; i <= n; i++)
{
Read(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;
}