Advertisement
welleyth

CEOI 2022 Day 1. A 100

Jul 27th, 2022
973
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.80 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <ext/pb_ds/assoc_container.hpp>
  3. #include <ext/pb_ds/tree_policy.hpp>
  4.  
  5. //#define int long long
  6. #define mp make_pair
  7. #define pb push_back
  8.  
  9. using namespace std;
  10. using namespace __gnu_pbds;
  11. mt19937 rnd(time(nullptr));
  12.  
  13. constexpr int N = (int)1e6 + 111;
  14. constexpr int INF = (int)1e9 + 111;
  15.  
  16. int T[4*N];
  17. int w[4*N];
  18. void push(int v,int l,int r){
  19.     if(w[v] == 0)
  20.         return;
  21.     int m = (l+r)>>1;
  22.     T[v<<1] += w[v];
  23.     T[v<<1|1] += w[v];
  24.     w[v<<1] += w[v];
  25.     w[v<<1|1] += w[v];
  26.     w[v] = 0;
  27.     return;
  28. }
  29. void upd(int v,int l,int r,int tl,int tr,int x){
  30.     if(l > r || tl > tr){
  31.         return;
  32.     }
  33.     if(l == tl && r == tr){
  34.         T[v] += x;
  35.         w[v] += x;
  36.         return;
  37.     }
  38.     push(v,l,r);
  39.     int m = (l+r)>>1;
  40.     upd(v<<1,l,m,tl,min(tr,m),x);
  41.     upd(v<<1|1,m+1,r,max(tl,m+1),tr,x);
  42.     T[v] = min(T[v<<1],T[v<<1|1]);
  43.     return;
  44. }
  45. int n,q;
  46. void upd(int l,int r,int x){
  47.     upd(1,1,n,l,r,x);
  48.     return;
  49. }
  50. int get(int v,int l,int r,int tl,int tr){
  51.     if(l > r || tl > tr)
  52.         return INF;
  53.     if(l == tl && r == tr)
  54.         return T[v];
  55.     push(v,l,r);
  56.     int m = (l+r)>>1;
  57.     return min(get(v<<1,l,m,tl,min(tr,m)),get(v<<1|1,m+1,r,max(m+1,tl),tr));
  58. }
  59.  
  60. int get(int l,int r){
  61.     return get(1,1,n,l,r);
  62. }
  63.  
  64. int getPos(int v,int l,int r,int x){ /// get a[pos] <= x
  65.     if(l > r)
  66.         return -1;
  67.     if(l == r)
  68.         return l;
  69.     int m = (l+r)>>1;
  70.     push(v,l,r);
  71.     if(T[v<<1] <= x)
  72.         return getPos(v<<1,l,m,x);
  73.     else
  74.         return getPos(v<<1|1,m+1,r,x);
  75. }
  76.  
  77. int getSuff(int r){
  78.     return get(r,r);
  79. }
  80.  
  81. int a[N];
  82. int t[N],P[N];
  83.  
  84. set<int> st;
  85. int parent[N];
  86. vector<pair<int,pair<int,int>>> Q;
  87. int ans[N];
  88. int len[N];
  89.  
  90. void __attribute__ (( optimize("Ofast","unroll-loops"), target("avx2") )) solve(){
  91.     n = (int)10000, q = (int)10000;
  92.     for(int i = 0; i <= n; i++) T[i] = 0;
  93.     st.clear();
  94.     Q.clear();
  95.     cin >> n >> q;
  96.     int rv[n+1];
  97.     for(int i = 0; i < n; i++){
  98.         cin >> a[i];
  99.         rv[a[i]] = i;
  100.     }
  101.     int nxt[n+1];
  102.     vector<pair<int,int>> RightBiggest;
  103.     for(int i = n-1; i >= 0; i--){
  104.         while(!RightBiggest.empty() && RightBiggest.back().first < a[i])
  105.             RightBiggest.pop_back();
  106.         if(!RightBiggest.empty())
  107.             nxt[i] = RightBiggest.back().second;
  108.         else
  109.             nxt[i] = n;
  110.         RightBiggest.pb(mp(a[i],i));
  111.     }
  112.     for(int i = 0; i < q; i++){
  113.         cin >> t[i] >> P[i];
  114.         Q.pb(mp(t[i],mp(P[i],i)));
  115.     }
  116.     sort(Q.begin(),Q.end());
  117.     vector<pair<int,int>> v;
  118.     bool used[n+1];
  119.     for(int i = 0; i <= n; i++){
  120.         used[i] = false;
  121.     }
  122.     for(int i = 0; i < n; i++){
  123.         if(used[i])
  124.             continue;
  125.         int __r = nxt[i];
  126.         if(i < n/2)
  127.             __r = min(__r,n/2);
  128.         for(int j = i; j < __r; j++) used[j] = 1;
  129.         st.insert(a[i]);
  130.         len[a[i]] = __r - i;
  131.         upd(1,a[i],__r-i);
  132.     }
  133.     int cur_t = 1;
  134.     bool all = false;
  135.     for(auto& query : Q){
  136.         int& t = query.first;
  137.         int& pos = query.second.first;
  138.         int& id = query.second.second;
  139.         if(t == 0){
  140.             ans[id] = a[pos-1];
  141.             continue;
  142.         }
  143.         while(!all && cur_t < t){
  144.             int y = getPos(1,1,n,n/2);
  145.             auto it = st.lower_bound(y);
  146.             it--;
  147.             int x = *it;
  148.             int tr = getSuff(y);
  149.             if(n/2 - tr <= 0){
  150.                 all = true;
  151.                 break;
  152.             }
  153.             int delta = n/2 - tr;
  154.             int __len = len[x];
  155.             int __pos = rv[x] + __len - delta;
  156.             upd(1,x,-delta);
  157.             len[x] -= delta;
  158.             while(__pos < rv[x] + __len){
  159.                 int __r = min(nxt[__pos],rv[x] + __len);
  160.                 st.insert(a[__pos]);
  161.                 upd(1,a[__pos],__r-__pos);
  162.                 len[a[__pos]] = __r - __pos;
  163.                 __pos = __r;
  164.             }
  165.             cur_t++;
  166.         }
  167.         int x = getPos(1,1,n,n-pos);
  168.         auto it = st.lower_bound(x);
  169.         it--;
  170.         if(get(x,x) <= n-pos){
  171.             x = *it;
  172.         }
  173.         int sz = len[x];
  174.         int suffSum = 0;
  175.         it = st.lower_bound(x);
  176.         it++;
  177.         if(it != st.end()){
  178.             int y = *it;
  179.             suffSum = getSuff(y);
  180.         }
  181.         int cur_pos = (n - pos + 1) - suffSum;
  182.         cur_pos = sz - cur_pos;
  183.         int __pos = rv[x];
  184.         ans[id] = a[__pos + cur_pos];
  185.     }
  186.     for(int i = 0; i < q; i++){
  187.         cout << ans[i] << "\n";
  188.     }
  189.     return;
  190. }
  191.  
  192. signed main(){
  193.     ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
  194.     int tests = 1;
  195. //    cin >> tests;
  196.     for(int test = 1; test <= tests; test++){
  197.         solve();
  198.     }
  199.     return 0;
  200. }
  201. /**
  202. **/
  203.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement