Pagini recente » Cod sursa (job #1715929) | Cod sursa (job #207189) | Diferente pentru home intre reviziile 373 si 374 | Cod sursa (job #502486) | Cod sursa (job #853953)
Cod sursa(job #853953)
#include <fstream>
#define NMAX 500001
using namespace std;
ifstream input("algsort.in");
ofstream output("algsort.out");
int vect[NMAX];
pair <int,int> tree[2 * NMAX];
int N;
const int Infinit = 2147483647;
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 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;
}