Advertisement
he_obviously

Untitled

Nov 11th, 2020
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.39 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <vector>
  4. #include <limits.h>
  5. #include <map>
  6. #include <unordered_map>
  7. #include <set>
  8. #include <unordered_set>
  9. #include <string>
  10. #include <algorithm>
  11. #include <iomanip>
  12. #include <random>
  13. #include <time.h>
  14. #include <bitset>
  15. #include <queue>
  16. #include <deque>
  17.  
  18. using namespace std;
  19.  
  20. typedef long long ll;
  21. typedef unsigned long long ull;
  22. typedef long double ld;
  23.  
  24. #define sz(x) (int)x.size()
  25. #define all(x) (x).begin(),(x).end()
  26.  
  27. const int MAXN = 1000 * 1000 + 1;
  28.  
  29. struct node {
  30.     int s = 0, set = -1;
  31.     node() {}
  32. };
  33.  
  34. unordered_map<int, set<int>> nums;
  35. vector<node> a(4 * MAXN), b(4 * MAXN);
  36.  
  37. void push(vector<node>& tree, int v, int tl, int tr) {
  38.     if (tr == tl || tree[v].set == -1) return;
  39.     int tm = (int)(tl + tr) / 2;
  40.     tree[2 * v].set = tree[v].set;
  41.     tree[2 * v].s = (tm - tl + 1) * tree[v].set;
  42.     tree[2 * v + 1].set = tree[v].set;
  43.     tree[2 * v + 1].s = (tr - tm) * tree[v].set;
  44.     tree[v].set = -1;
  45. }
  46.  
  47. void update(vector<node>& tree, int v, int tl, int tr, int l, int r, int x) {
  48.     push(tree, v, tl, tr);
  49.     if (l > r) {
  50.         return;
  51.     }
  52.     if (tl == l && tr == r) {
  53.         tree[v].set = x;
  54.         tree[v].s = (tr - tl + 1) * x;
  55.         return;
  56.     }
  57.     int tm = (tl + tr) / 2;
  58.     update(tree, 2 * v, tl, tm, l, min(tm, r), x);
  59.     update(tree, 2 * v + 1, tm + 1, tr, max(tm + 1, l), r, x);
  60.     tree[v].s = tree[2 * v].s + tree[2 * v + 1].s;
  61. }
  62.  
  63. int get_sum(vector<node>& tree, int v, int tl, int tr, int l, int r) {
  64.     push(tree, v, tl, tr);
  65.     if (l > r) {
  66.         return 0;
  67.     }
  68.     if (tl == l && tr == r) {
  69.         return tree[v].s;
  70.     }
  71.     int tm = (tl + tr) / 2;
  72.     return get_sum(tree, 2 * v, tl, tm, l, min(tm, r)) +
  73.         get_sum(tree, 2 * v + 1, tm + 1, tr, max(tm + 1, l), r);
  74. }
  75.  
  76. void set_num(vector<node>& tree, int v, int tl, int tr, int pos, int val) {
  77.     if (tl == tr) {
  78.         tree[v].s = val;
  79.         return;
  80.     }
  81.     int tm = (tl + tr) / 2;
  82.     if (pos <= tm) {
  83.         set_num(tree, 2 * v, tl, tm, pos, val);
  84.     }
  85.     else {
  86.         set_num(tree, 2 * v + 1, tm + 1, tr, pos, val);
  87.     }
  88.     tree[v].s = tree[2 * v].s + tree[2 * v + 1].s;
  89. }
  90.  
  91. int main() {
  92.  
  93.     ios_base::sync_with_stdio(0);
  94.     cin.tie(0); cout.tie(0);
  95.  
  96.     int n, m;
  97.    
  98.     cin >> n;
  99.     vector<int> aa(n);
  100.  
  101.     for (int i = 0; i < n; ++i) {
  102.         cin >> aa[i];
  103.     }
  104.  
  105.     cin >> m;
  106.     vector<int> bb(m);
  107.  
  108.     for (int i = 0; i < m; ++i) {
  109.         cin >> bb[i];
  110.     }
  111.  
  112.     vector<int> c;
  113.  
  114.     merge(all(aa), all(bb), back_inserter(c));
  115.  
  116.     for (int i = 0; i < sz(c); ++i) {
  117.         nums[c[i]].insert(i);
  118.     }
  119.  
  120.     for (int i = 0; i < n; ++i) {
  121.         int p = *(nums[aa[i]].begin());
  122.         nums[aa[i]].erase(p);
  123.         set_num(a, 1, 0, n + m - 1, p, 1);
  124.     }
  125.  
  126.     for (int i = 0; i < m; ++i) {
  127.         int p = *(nums[bb[i]].begin());
  128.         nums[bb[i]].erase(p);
  129.         set_num(b, 1, 0, n + m - 1, p, 1);
  130.     }
  131.  
  132.     int q;
  133.     cin >> q;
  134.  
  135.     for (int _ = 0; _ < q; ++_) {
  136.         int type, l, r;
  137.         cin >> type >> l >> r;
  138.         if (type == 1) {
  139.             int left = -1, right = n + m;
  140.             while (right - left > 1) {
  141.                 int mid = (right + left) / 2;
  142.                 if (get_sum(a, 1, 0, n + m - 1, 0, mid) < l) {
  143.                     left = mid;
  144.                 }
  145.                 else {
  146.                     right = mid;
  147.                 }
  148.             }
  149.             int left_ans = right;
  150.             int left1 = -1, right1 = n + m;
  151.             while (right1 - left1 > 1) {
  152.                 int mid = (right1 + left1) / 2;
  153.                 if (get_sum(a, 1, 0, n + m - 1, 0, mid) < r) {
  154.                     left1 = mid;
  155.                 }
  156.                 else {
  157.                     right1 = mid;
  158.                 }
  159.             }
  160.             int right_ans = right1;
  161.             update(a, 1, 0, n + m - 1, left_ans, right_ans, 0);
  162.             update(b, 1, 0, n + m - 1, left_ans, right_ans, 1);
  163.         }
  164.         else {
  165.             int left = -1, right = n + m;
  166.             while (right - left > 1) {
  167.                 int mid = (right + left) / 2;
  168.                 if (get_sum(b, 1, 0, n + m - 1, 0, mid) < l) {
  169.                     left = mid;
  170.                 }
  171.                 else {
  172.                     right = mid;
  173.                 }
  174.             }
  175.             int left_ans = right;
  176.             int left1 = -1, right1 = n + m;
  177.             while (right1 - left1 > 1) {
  178.                 int mid = (right1 + left1) / 2;
  179.                 if (get_sum(b, 1, 0, n + m - 1, 0, mid) < r) {
  180.                     left1 = mid;
  181.                 }
  182.                 else {
  183.                     right1 = mid;
  184.                 }
  185.             }
  186.             int right_ans = right1;
  187.             update(b, 1, 0, n + m - 1, left_ans, right_ans, 0);
  188.             update(a, 1, 0, n + m - 1, left_ans, right_ans, 1);
  189.         }
  190.     }
  191.  
  192.     vector<int> ans_a, ans_b;
  193.  
  194.     for (int i = 0; i < n + m; ++i) {
  195.         if (get_sum(a, 1, 0, n + m - 1, i, i)) {
  196.             ans_a.push_back(c[i]);
  197.         }
  198.     }
  199.  
  200.     for (int i = 0; i < n + m; ++i) {
  201.         if (get_sum(b, 1, 0, n + m - 1, i, i)) {
  202.             ans_b.push_back(c[i]);
  203.         }
  204.     }
  205.  
  206.     cout << sz(ans_a) << "\n";
  207.  
  208.     for (int i : ans_a) cout << i << " ";
  209.  
  210.     cout << "\n";
  211.  
  212.     cout << sz(ans_b) << "\n";
  213.  
  214.     for (int i : ans_b) cout << i << " ";
  215.  
  216.     return 0;
  217. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement