#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
//#define ONLINE_JUDGE
const int MAXN = 131072;
const int MAX_NODE_N = MAXN*2+1;
using namespace std;
struct Element
{
int number;//number from input
int index;//order from input
};
bool operator < (const Element &A, const Element &B)
{
return A.number < B.number;//sort by num
}
Element num[MAXN];
int segTreeRMQ[MAX_NODE_N];
void readInputArr(int N)
{
for(int i=0; i<N; i++)
{
num[i].index = i;
scanf("%d",&num[i].number);
}
}
#ifndef ONLINE_JUDGE
void testArr(int N)
{
puts("-------------");
puts("Test read : (num,index)");
for(int i=0; i<N; i++)
printf(" (%d,%d)", num[i].number, num[i].index);
puts("\n-------------");
}
#endif // ONLINE_JUDGE
//referenece
//http://w...content-available-to-author-only...r.com/tc?d1=tutorials&d2=lowestCommonAncestor&module=Static
//almost the same code, OMG
void initializeTree(int node_i, int b, int e, int M[MAX_NODE_N], Element A[MAXN], int N)
{
if(b==e)
M[node_i] = b;//position of min "index from input"
else
{
//node_i : heap style
initializeTree(2*node_i, b, (b+e)/2 , M, A, N);//init left
initializeTree(2*node_i+1, (b+e)/2+1, e, M, A, N);//init right
//b,e 1~N
//Arr 0~N
if(A[M[2*node_i]].index<=A[M[2*node_i+1]].index)
M[node_i] = M[2*node_i];//choose left child min
else
M[node_i] = M[2*node_i+1];
}
//debug info
#ifndef ONLINE_JUDGE
printf("segT[%d][%d,%d]=%d, A[%d].index=%d\n",node_i, b, e, M[node_i], A[M[node_i]]);
#endif // ONLINE_JUDGE
}
//i, j is query range i<=j
int query(int node_i, int b, int e, int M[MAX_NODE_N], Element A[MAXN], int i, int j)
{
int p1, p2;
//no intersection
//A.lesser > B.greater or A.greater < B.lesser
// [i,j]
//
// [b,e]
//--------------
// [i,j]
// [b,e]
if(i>e || j<b)
return -1;//NULL
//intersect, included
// [i, j]
// [b,e]
if(b>=i&&e<=j)
return M[node_i];
//intersect, not include
p1 = query(2*node_i, b, (b+e)/2, M, A, i, j);
p2 = query(2*node_i+1, (b+e)/2+1, e, M, A, i, j);
if(p1==-1)
return p2;//M[node]=p2?
if(p2==-1)
return p1;
if(A[p1].index<=A[p2].index)
return p1;
else
return p2;
}
const int segTreeRootI = 1;
void fake_preorder_tra(int i, int j, int N, int M[MAX_NODE_N], Element A[MAXN])
{
int rootPos = query(segTreeRootI, 0, N-1, M, A, i,j);//root
if(rootPos>=0&&rootPos<N)
{
if(A[rootPos].index==0)
printf("%d", A[rootPos].number);
else
printf(" %d", A[rootPos].number);
if(i!=j)//not leave
{
//left
fake_preorder_tra(i,rootPos-1, N, M, A);
//right
fake_preorder_tra(rootPos+1,j, N, M, A);
}
}
}
int main()
{
int N;
while(scanf("%d",&N)!=EOF)
{
readInputArr(N);
//debug info
#ifndef ONLINE_JUDGE
testArr(N);
#endif // ONLINE_JUDGE
std::sort(num,num+N);//get Inorder traversal
//debug info
#ifndef ONLINE_JUDGE
printf("sorted\n");
testArr(N);
#endif // ONLINE_JUDGE
initializeTree(segTreeRootI,0,N-1,segTreeRMQ,num,N);
fake_preorder_tra(0,N-1,N,segTreeRMQ,num);
putchar('\n');
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8Y3N0ZGlvPgojaW5jbHVkZSA8Y3N0ZGxpYj4KCi8vI2RlZmluZSBPTkxJTkVfSlVER0UKCmNvbnN0IGludCBNQVhOID0gMTMxMDcyOwpjb25zdCBpbnQgTUFYX05PREVfTiA9IE1BWE4qMisxOwp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IEVsZW1lbnQKewogICAgaW50IG51bWJlcjsvL251bWJlciBmcm9tIGlucHV0CiAgICBpbnQgaW5kZXg7Ly9vcmRlciBmcm9tIGlucHV0Cn07Cgpib29sIG9wZXJhdG9yIDwgKGNvbnN0IEVsZW1lbnQgJkEsIGNvbnN0IEVsZW1lbnQgJkIpCnsKICAgIHJldHVybiBBLm51bWJlciA8IEIubnVtYmVyOy8vc29ydCBieSBudW0KfQoKRWxlbWVudCBudW1bTUFYTl07CmludCBzZWdUcmVlUk1RW01BWF9OT0RFX05dOwoKdm9pZCByZWFkSW5wdXRBcnIoaW50IE4pCnsKICAgIGZvcihpbnQgaT0wOyBpPE47IGkrKykKICAgIHsKICAgICAgICBudW1baV0uaW5kZXggPSBpOwogICAgICAgIHNjYW5mKCIlZCIsJm51bVtpXS5udW1iZXIpOwogICAgfQp9CgojaWZuZGVmIE9OTElORV9KVURHRQp2b2lkIHRlc3RBcnIoaW50IE4pCnsKICAgIHB1dHMoIi0tLS0tLS0tLS0tLS0iKTsKICAgIHB1dHMoIlRlc3QgcmVhZCA6IChudW0saW5kZXgpIik7CiAgICBmb3IoaW50IGk9MDsgaTxOOyBpKyspCiAgICAgICAgcHJpbnRmKCIgKCVkLCVkKSIsIG51bVtpXS5udW1iZXIsIG51bVtpXS5pbmRleCk7CiAgICBwdXRzKCJcbi0tLS0tLS0tLS0tLS0iKTsKfQojZW5kaWYgLy8gT05MSU5FX0pVREdFCi8vcmVmZXJlbmVjZQovL2h0dHA6Ly93Li4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5yLmNvbS90Yz9kMT10dXRvcmlhbHMmZDI9bG93ZXN0Q29tbW9uQW5jZXN0b3ImbW9kdWxlPVN0YXRpYwoKLy9hbG1vc3QgdGhlIHNhbWUgY29kZSwgT01HCnZvaWQgaW5pdGlhbGl6ZVRyZWUoaW50IG5vZGVfaSwgaW50IGIsIGludCBlLCBpbnQgTVtNQVhfTk9ERV9OXSwgRWxlbWVudCBBW01BWE5dLCBpbnQgTikKewogICAgaWYoYj09ZSkKICAgICAgICBNW25vZGVfaV0gPSBiOy8vcG9zaXRpb24gb2YgbWluICJpbmRleCBmcm9tIGlucHV0IgogICAgZWxzZQogICAgewogICAgICAgIC8vbm9kZV9pIDogaGVhcCBzdHlsZQogICAgICAgIGluaXRpYWxpemVUcmVlKDIqbm9kZV9pLCBiLCAoYitlKS8yICwgTSwgQSwgTik7Ly9pbml0IGxlZnQKICAgICAgICBpbml0aWFsaXplVHJlZSgyKm5vZGVfaSsxLCAoYitlKS8yKzEsIGUsIE0sIEEsIE4pOy8vaW5pdCByaWdodAogICAgICAgIC8vYixlIDF+TgogICAgICAgIC8vQXJyIDB+TgogICAgICAgIGlmKEFbTVsyKm5vZGVfaV1dLmluZGV4PD1BW01bMipub2RlX2krMV1dLmluZGV4KQogICAgICAgICAgICBNW25vZGVfaV0gPSBNWzIqbm9kZV9pXTsvL2Nob29zZSBsZWZ0IGNoaWxkIG1pbgogICAgICAgIGVsc2UKICAgICAgICAgICAgTVtub2RlX2ldID0gTVsyKm5vZGVfaSsxXTsKICAgIH0KCiAgICAvL2RlYnVnIGluZm8KICAgICNpZm5kZWYgT05MSU5FX0pVREdFCiAgICBwcmludGYoInNlZ1RbJWRdWyVkLCVkXT0lZCwgQVslZF0uaW5kZXg9JWRcbiIsbm9kZV9pLCBiLCBlLCBNW25vZGVfaV0sIEFbTVtub2RlX2ldXSk7CiAgICAjZW5kaWYgLy8gT05MSU5FX0pVREdFCn0KCi8vaSwgaiBpcyBxdWVyeSByYW5nZSBpPD1qCmludCBxdWVyeShpbnQgbm9kZV9pLCBpbnQgYiwgaW50IGUsIGludCBNW01BWF9OT0RFX05dLCBFbGVtZW50IEFbTUFYTl0sIGludCBpLCBpbnQgaikKewogICAgaW50IHAxLCBwMjsKCiAgICAvL25vIGludGVyc2VjdGlvbgogICAgLy9BLmxlc3NlciA+IEIuZ3JlYXRlciBvciBBLmdyZWF0ZXIgPCBCLmxlc3NlcgogICAgLy8gW2ksal0KICAgIC8vCiAgICAvLyAgICAgICAgW2IsZV0KICAgIC8vLS0tLS0tLS0tLS0tLS0KICAgIC8vICAgICAgICAgW2ksal0KICAgIC8vIFtiLGVdCiAgICBpZihpPmUgfHwgajxiKQogICAgICAgIHJldHVybiAtMTsvL05VTEwKCiAgICAvL2ludGVyc2VjdCwgaW5jbHVkZWQKICAgIC8vIFtpLCAgICAgICAgICAgal0KICAgIC8vICAgICAgIFtiLGVdCiAgICBpZihiPj1pJiZlPD1qKQogICAgICAgIHJldHVybiBNW25vZGVfaV07CgogICAgLy9pbnRlcnNlY3QsIG5vdCBpbmNsdWRlCiAgICBwMSA9IHF1ZXJ5KDIqbm9kZV9pLCBiLCAoYitlKS8yLCBNLCBBLCBpLCBqKTsKICAgIHAyID0gcXVlcnkoMipub2RlX2krMSwgKGIrZSkvMisxLCBlLCBNLCBBLCBpLCBqKTsKCiAgICBpZihwMT09LTEpCiAgICAgICAgcmV0dXJuIHAyOy8vTVtub2RlXT1wMj8KICAgIGlmKHAyPT0tMSkKICAgICAgICByZXR1cm4gcDE7CgogICAgaWYoQVtwMV0uaW5kZXg8PUFbcDJdLmluZGV4KQogICAgICAgIHJldHVybiBwMTsKICAgIGVsc2UKICAgICAgICByZXR1cm4gcDI7Cgp9Cgpjb25zdCBpbnQgc2VnVHJlZVJvb3RJID0gMTsKdm9pZCBmYWtlX3ByZW9yZGVyX3RyYShpbnQgaSwgaW50IGosIGludCBOLCBpbnQgTVtNQVhfTk9ERV9OXSwgRWxlbWVudCBBW01BWE5dKQp7CiAgICBpbnQgcm9vdFBvcyA9IHF1ZXJ5KHNlZ1RyZWVSb290SSwgMCwgTi0xLCBNLCBBLCBpLGopOy8vcm9vdAogICAgaWYocm9vdFBvcz49MCYmcm9vdFBvczxOKQogICAgewogICAgICAgIGlmKEFbcm9vdFBvc10uaW5kZXg9PTApCiAgICAgICAgICAgIHByaW50ZigiJWQiLCBBW3Jvb3RQb3NdLm51bWJlcik7CiAgICAgICAgZWxzZQogICAgICAgICAgICBwcmludGYoIiAlZCIsIEFbcm9vdFBvc10ubnVtYmVyKTsKCgogICAgICAgIGlmKGkhPWopLy9ub3QgbGVhdmUKICAgICAgICB7CiAgICAgICAgIC8vbGVmdAogICAgICAgICAgICBmYWtlX3ByZW9yZGVyX3RyYShpLHJvb3RQb3MtMSwgTiwgTSwgQSk7CiAgICAgICAgLy9yaWdodAogICAgICAgICAgICBmYWtlX3ByZW9yZGVyX3RyYShyb290UG9zKzEsaiwgTiwgTSwgQSk7CiAgICAgICAgfQoKICAgIH0KfQoKaW50IG1haW4oKQp7CiAgICBpbnQgTjsKICAgIHdoaWxlKHNjYW5mKCIlZCIsJk4pIT1FT0YpCiAgICB7CiAgICAgICAgcmVhZElucHV0QXJyKE4pOwoKICAgICAgICAvL2RlYnVnIGluZm8KICAgICAgICAjaWZuZGVmIE9OTElORV9KVURHRQogICAgICAgIHRlc3RBcnIoTik7CiAgICAgICAgI2VuZGlmIC8vIE9OTElORV9KVURHRQoKICAgICAgICBzdGQ6OnNvcnQobnVtLG51bStOKTsvL2dldCBJbm9yZGVyIHRyYXZlcnNhbAoKICAgICAgICAvL2RlYnVnIGluZm8KICAgICAgICAjaWZuZGVmIE9OTElORV9KVURHRQogICAgICAgIHByaW50Zigic29ydGVkXG4iKTsKICAgICAgICB0ZXN0QXJyKE4pOwogICAgICAgICNlbmRpZiAvLyBPTkxJTkVfSlVER0UKCgogICAgICAgIGluaXRpYWxpemVUcmVlKHNlZ1RyZWVSb290SSwwLE4tMSxzZWdUcmVlUk1RLG51bSxOKTsKICAgICAgICBmYWtlX3ByZW9yZGVyX3RyYSgwLE4tMSxOLHNlZ1RyZWVSTVEsbnVtKTsKICAgICAgICBwdXRjaGFyKCdcbicpOwogICAgfQogICAgcmV0dXJuIDA7Cn0K