Advertisement
Guest User

Untitled

a guest
Aug 6th, 2017
253
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.88 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5.  
  6. const int maxi=2e6+6;
  7.  
  8.  
  9. int t[2][maxi];
  10. int a[maxi],b[maxi];
  11. int len,n;
  12. int p[maxi];
  13. int rez[maxi];
  14. set<int> st;
  15. set<int>st1;
  16.  
  17. void build(int *a, int n, int tip)
  18. {
  19. len=1<< int (ceil(log2(n)));
  20.  
  21. //cout<<len<<"\n";
  22. for (int i=len;i<2*len;i++)
  23. t[tip][i]=1e9;
  24.  
  25. for (int i=len;i<2*len;i++)
  26. if (i>len+n-1) t[tip][i]=1e9; else
  27. if (i%2==0 && tip==1) t[1][i]=a[i-len+1]; else
  28. if (i%2==1 && tip==0)
  29. t[0][i]=a[i-len+1];
  30.  
  31. for (int i=len-1;i>0;i--)
  32. t[tip][i]=min(t[tip][i<<1],t[tip][i<<1|1]);
  33. }
  34.  
  35.  
  36. int get(int l, int r,int tip)
  37. {
  38. int ans=a[l];
  39.  
  40. l+=len-1;
  41. r+=len;
  42.  
  43. for (;l<r;l>>=1,r>>=1){
  44. if (l&1) ans=min(ans,t[tip][l++]);
  45. if (r&1) ans=min(ans,t[tip][--r]);
  46. }
  47. return ans;
  48. }
  49.  
  50.  
  51. int main()
  52. {
  53.  
  54. cin>>n;
  55.  
  56. for (int i=1;i<=n;i++)
  57. {
  58. scanf("%d",&a[i]);
  59. p[a[i]]=i;
  60. }
  61.  
  62. build(a,n,0);
  63. build(a,n,1);
  64.  
  65. st1.insert(0);
  66. st1.insert(n+1);
  67.  
  68. st.insert(get(1,n,1));
  69.  
  70. for (int i=1;i<=n;i+=2)
  71. {
  72. int cur=*st.begin();
  73. rez[i]=cur;
  74. int tip=(1-p[cur]%2);
  75. int idx=*st1.lower_bound(p[cur]);
  76. rez[i+1]=get(p[cur]+1,idx-1,tip);
  77. st.erase(cur);
  78.  
  79. set<int>::iterator it=st1.lower_bound(p[cur]);
  80. it--;
  81.  
  82. int ispod=*it;
  83. st1.insert(p[cur]);
  84. st1.insert(p[rez[i+1]]);
  85.  
  86. if (p[cur]-ispod>1)
  87. st.insert(get(ispod+1,p[cur]-1,(ispod+1)%2));
  88.  
  89. if (p[rez[i+1]]-p[cur]>1)
  90. st.insert(get(p[cur]+1,p[rez[i+1]]-1,(p[cur]+1)%2));
  91.  
  92. if (idx-p[rez[i+1]]>1)
  93. st.insert(get(p[rez[i+1]]+1,idx-1,(p[rez[i+1]]+1)%2));
  94.  
  95. }
  96.  
  97. for (int i=1;i<=n;i++)
  98. printf("%d ",rez[i]);
  99. printf("\n");
  100. return 0;
  101. }
  102.  
  103. //RINGISPIL SE PLACA
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement