Advertisement
MinhNGUYEN2k4

Untitled

Sep 7th, 2021
1,067
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.51 KB | None | 0 0
  1. //Nguyen Huu Hoang Minh
  2. #include <bits/stdc++.h>
  3. #define sz(x) int(x.size())
  4. #define all(x) x.begin(),x.end()
  5. #define reset(x) memset(x, 0,sizeof(x))
  6. #define pb push_back
  7. #define mp make_pair
  8. #define fi first
  9. #define se second
  10. #define N 500005
  11. #define remain(x) if (x > MOD) x -= MOD
  12. #define ii pair<int, int>
  13. #define iiii pair< ii , ii >
  14. #define viiii vector< iiii >
  15. #define vi vector<int>
  16. #define vii vector< ii >
  17. #define bit(x, i) (((x) >> (i)) & 1)
  18. #define Task "test"
  19. #define int long long
  20.  
  21. using namespace std;
  22.  
  23. typedef long double ld;
  24. const int inf = 1e10;
  25. const int minf = -1e10;
  26.  
  27. int n;
  28. int s[N];
  29. int p[N], q[N];
  30.  
  31. void readfile()
  32. {
  33.     ios_base::sync_with_stdio(false);
  34.     cin.tie(0);cout.tie(0);
  35.     if (fopen(Task".inp","r"))
  36.     {
  37.         freopen(Task".inp","r",stdin);
  38.         //freopen(Task".out","w",stdout);
  39.     }
  40.     cin >> n;
  41.     s[0] = minf;
  42.     s[n+1] = inf;
  43.     for(int i=1; i<=n; i++) cin >> s[i];
  44.     for(int i=1; i<=n; i++) cin >> p[i];
  45.     for(int i=1; i<=n; i++) cin >> q[i];
  46. }
  47.  
  48. int rig[N][20];
  49. int lef[N][20];
  50.  
  51. void proc()
  52. {
  53.     stack<int> st;
  54.     for(int i=0; i<=1+n; i++){
  55.         while (st.size() && s[st.top()]<s[i]){
  56.             rig[st.top()][0] = i;
  57.             st.pop();
  58.         }
  59.         st.push(i);
  60.     }
  61.     rig[0][0] = 1;
  62.     rig[n][0] = n+1;
  63.     rig[n+1][0] = n+1;
  64.     while (st.size()) st.pop();
  65.     for(int i=n+1; i>=0; i--){
  66.         while (st.size() && s[st.top()]>s[i]){
  67.             lef[st.top()][0] = i;
  68.             st.pop();
  69.         }
  70.         st.push(i);
  71.     }
  72.     lef[n+1][0] = n;
  73.     lef[1][0] = 0;
  74.     lef[0][0] = 0;
  75.     for(int j=1; j<20; j++){
  76.         for(int i=0; i<=n+1; i++){
  77.             rig[i][j] = rig[rig[i][j-1]][j-1];
  78.             lef[i][j] = lef[lef[i][j-1]][j-1];
  79.         }
  80.     }
  81.     for(int i=1; i<=n; i++){
  82.         int l = q[i];
  83.         int r = p[i];
  84.         int cur1=i;
  85.         for(int j=19; j>=0; j--){
  86.             if (bit(r,j)) cur1 = rig[cur1][j];
  87.         }
  88.         for(int j=19; j>=0; j--){
  89.             if (bit(l,j)) cur1 = lef[cur1][j];
  90.         }
  91.         int s1 = s[cur1];
  92.         int cur2 = i;
  93.         for(int j=19; j>=0; j--){
  94.             if (bit(l,j)) cur2 = lef[cur2][j];
  95.         }
  96.         for(int j=19; j>=0; j--){
  97.             //if (bit(r,j)) cout << j << ' ';
  98.             if (bit(r,j)) cur2 = rig[cur2][j];
  99.         }
  100.         int s2 = s[cur2];
  101.         if (s1 >= s2) cout << cur1 << ' ';
  102.         else cout << cur2 << ' ';
  103.     }
  104. }
  105.  
  106. signed main()
  107. {
  108.     readfile();
  109.     proc();
  110.     return 0;
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement