wery00

Untitled

Nov 11th, 2020
618
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.73 KB | None | 0 0
  1. #pragma GCC optimize("Ofast")
  2. #pragma GCC target("avx,avx2,fma")
  3. #include<bits/stdc++.h>
  4. #define F first
  5. #define S second
  6. #define vec vector
  7. #define pb push_back
  8. #define pll pair<ll, ll>
  9. #define pdd pair<ld, ld>
  10. #define umap unordered_map
  11. #define uset unordered_set
  12. #define pii pair<int, int>
  13. #define pnn pair<Node*, Node*>
  14. #define all(m) m.begin(), m.end()
  15. #define uid uniform_int_distribution
  16. #define init(m, x) memset(m, x, sizeof(m));
  17. #define FILE ifstream in("input.txt"); ofstream out("output.txt");
  18. #define fast cin.tie(0); cout.tie(0); cin.sync_with_stdio(0); cout.sync_with_stdio(0);
  19. using namespace std;
  20. typedef string str;
  21. typedef long long ll;
  22. typedef long double ld;
  23. typedef unsigned int uint;
  24. typedef unsigned long long ull;
  25. mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
  26.  
  27. struct Node{
  28.     Node *l = 0, *r = 0;
  29.     int x, y, sz, e;
  30.  
  31.     Node(){}
  32.  
  33.     Node(int a){
  34.         x = e = a;
  35.         y = rnd();
  36.         sz = 1;
  37.     }
  38. };
  39.  
  40. int gsz(Node *n){return n ? n->sz : 0;}
  41. int ge(Node *n){return n ? n->e : 0;}
  42. void upd(Node *n){
  43.     if(!n) return;
  44.     n->sz = gsz(n->l) + 1 + gsz(n->r);
  45.     n->e = ge(n->l) + n->x + ge(n->r);
  46. }
  47.  
  48. Node* merge(Node *l, Node *r){
  49.     if(!l) return r;
  50.     if(!r) return l;
  51.     if(l->y > r->y){
  52.         l->r = merge(l->r, r); upd(l);
  53.         return l;
  54.     }
  55.     r->l = merge(l, r->l); upd(r);
  56.     return r;
  57. }
  58.  
  59. pnn splitSz(Node *n, int k){
  60.     if(!n) return {0,0};
  61.     if(k<=gsz(n->l)){
  62.         pnn p = splitSz(n->l, k);
  63.         n->l = p.S; upd(n);
  64.         p.S = n;
  65.         return p;
  66.     }
  67.     pnn p = splitSz(n->r, k-gsz(n->l)-1);
  68.     n->r = p.F; upd(n);
  69.     p.F = n;
  70.     return p;
  71. }
  72.  
  73. const int G = 15001;    //!!!!!!!!!!!1
  74. int a, b, z;
  75. int kek[G*2+5], m[G], n[G];
  76.  
  77. void print(Node *n, int ps){
  78.     if(!n) return;
  79.     print(n->l, ps);
  80.     for(int q=0; q<n->x; q++) cout<<kek[ps]<<" ";
  81.     //for(int q=0; q<n->x; q++) cout<<ps+gsz(n->l)+1<<" ";
  82.     print(n->r, ps+gsz(n->l)+1);
  83. }
  84.  
  85. void compress(){
  86.     for(int q=0; q<a; q++) kek[q] = m[q];
  87.     for(int q=0; q<b; q++) kek[a+q] = n[q];
  88.     inplace_merge(kek, kek+a, kek+a+b);
  89.     for(int q=0; q<a; q++) m[q] = lower_bound(kek, kek+a+b, m[q]) - kek;
  90.     for(int q=0; q<b; q++) n[q] = lower_bound(kek, kek+a+b, n[q]) - kek;
  91. }
  92.  
  93. void add_to_pos(Node *n, int ps, int val){  // 1 - index
  94.     if(!n) return;
  95.     if(ps == gsz(n->l)+1) n->x += val, n->e += val;
  96.     else if(ps < gsz(n->l)+1) add_to_pos(n->l, ps, val);
  97.     else add_to_pos(n->r, ps-gsz(n->l)-1, val);
  98.     upd(n);
  99. }
  100.  
  101. Node* build(int l, int r){
  102.     if(l>r) return 0;
  103.     int md = (l+r)>>1;
  104.     Node *res = new Node(0);
  105.     res->l = build(l, md-1);
  106.     res->r = build(md+1, r);
  107.     upd(res);
  108.     return res;
  109. }
  110.  
  111. pair<int, pii> wtf(Node *n, int k, int c = 1){   //1 - index
  112.     assert(n);
  113.     if(ge(n->l)<k && k<=ge(n->l)+n->x){
  114.         return {c+gsz(n->l), {k-ge(n->l), n->x}};
  115.     }
  116.     if(k<=ge(n->l)) return wtf(n->l, k, c);
  117.     return wtf(n->r, k-ge(n->l)-n->x, c+gsz(n->l)+1);
  118. }
  119.  
  120. pnn smart_merge(Node *l, Node *r){
  121.     int sz = gsz(l);
  122.     if(sz==1){
  123.         r->x += l->x; r->e += l->x;
  124.         l->x = l->e = 0;
  125.         return {l, r};
  126.     }
  127.     if(ge(l)==0) return {l, r};
  128.     if(ge(r)==0) return {r, l};
  129.     pnn p1 = splitSz(l, sz/2);
  130.     pnn p2 = splitSz(r, sz/2);
  131.     pnn d1 = smart_merge(p1.F, p2.F);
  132.     pnn d2 = smart_merge(p1.S, p2.S);
  133.     return {merge(d1.F, d2.F), merge(d1.S, d2.S)};
  134. }
  135.  
  136. int main() {
  137.     fast;
  138.     cin>>a; for(int q=0; q<a; q++) cin>>m[q];
  139.     cin>>b; for(int q=0; q<b; q++) cin>>n[q];
  140.     compress();
  141.     Node *M = build(1, G*2), *N = build(1, G*2);
  142.     for(int q=0; q<a; q++) add_to_pos(M, m[q]+1, 1);
  143.     for(int q=0; q<b; q++) add_to_pos(N, n[q]+1, 1);
  144.  
  145.     cin>>z;
  146.     int t, l, r, d;
  147.     for(; z--; ){
  148.         cin>>t>>l>>r; d = r-l+1;
  149.         if(t==2) swap(M, N);
  150.         assert(ge(M)>=r);
  151.         pair<int, pii> p1 = wtf(M, l);
  152.         pair<int, pii> p2 = wtf(M, r);
  153.         if(p1.F==p2.F){
  154.             add_to_pos(N, p1.F, d);
  155.             add_to_pos(M, p1.F, -d);
  156.             if(t==2) swap(M, N);
  157.             continue;
  158.         }
  159.         add_to_pos(N, p1.F, p1.S.S-p1.S.F+1);
  160.         add_to_pos(M, p1.F, -(p1.S.S-p1.S.F+1));
  161.  
  162.         add_to_pos(N, p2.F, p2.S.F);
  163.         add_to_pos(M, p2.F, -p2.S.F);
  164.  
  165.         l = p1.F+1, r = p2.F-1;
  166.         if(l>r){if(t==2) swap(M, N);continue;}
  167.  
  168.         pnn m1 = splitSz(M, l-1), m2 = splitSz(m1.S, r-l+1);
  169.         pnn n1 = splitSz(N, l-1), n2 = splitSz(n1.S, r-l+1);
  170.         pnn mid = smart_merge(m2.F, n2.F);
  171.  
  172.         M = merge(merge(m1.F, mid.F), m2.S);
  173.         N = merge(merge(n1.F, mid.S), n2.S);
  174.  
  175.         if(t==2) swap(M, N);
  176.     }
  177.     cout<<ge(M)<<endl; print(M, 0); cout<<endl;
  178.     cout<<ge(N)<<endl; print(N, 0); cout<<endl;
  179. }
  180.  
Advertisement
Add Comment
Please, Sign In to add comment