Pagini recente » Cod sursa (job #479812) | Cod sursa (job #1149271) | Cod sursa (job #1649268) | Cod sursa (job #1018534) | Cod sursa (job #853949)
Cod sursa(job #853949)
#include <fstream>
#define NMAX 500001
#include <cmath>
using namespace std;
ifstream input("algsort.in");
ofstream output("algsort.out");
long long vect[NMAX];
pair <unsigned int,int> tree[3 * NMAX];
int N;
const unsigned int Infinit = (1 << 31);
void build_tree(int nod , int left , int right )
{
if (left == right)
{
tree[nod].first = vect[left];
tree[nod].second = left;
}
else
{
int middle = (left + right) >> 1;
int left_son = nod << 1;
int right_son = left_son + 1;
build_tree(left_son , left , middle);
build_tree(right_son , middle+1 , right);
if (tree[left_son].first < tree[right_son].first)
{
tree[nod] = tree[left_son];
}
else
{
tree[nod] = tree[right_son];
}
}
}
void update_tree(int nod , int left , int right , const unsigned int value , int A)
{
if (left == right)
{
tree[nod].first = value;
tree[nod].second = A;
}
else
{
int middle = (left + right) >> 1;
int left_son = nod << 1;
int right_son = left_son + 1;
if (A <= middle) update_tree(left_son , left , middle , value , A);
if (A > middle) update_tree(right_son , middle+1 , right , value , A);
if (tree[left_son].first < tree[right_son].first)
{
tree[nod] = tree[left_son];
}
else
{
tree[nod] = tree[right_son];
}
}
}
int main()
{
input >> N;
for (int i =1;i<=N;i++)
{
input >> vect[i];
}
build_tree(1,1,N);
for (int i =1;i<=N;i++)
{
output << tree[1].first << " ";
update_tree(1,1,N,-Infinit,tree[1].second);
}
input.close();
output.close();
return 0;
}