Advertisement
Guest User

Untitled

a guest
Dec 15th, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.08 KB | None | 0 0
  1. #pragma GCC optimize("Ofast")
  2. #include <bits/stdc++.h>
  3. #include <ext/pb_ds/assoc_container.hpp>
  4.  
  5. using namespace __gnu_pbds;
  6. using namespace std;
  7.  
  8. const bool debug = false;
  9.  
  10. #define ff first
  11. #define ss second
  12.  
  13. inline int readInt() {
  14. int c = getc(stdin);
  15. int x = 0;
  16. while (c <= 32) {
  17. c = getc(stdin);
  18. }
  19. while ('0' <= c && c <= '9') {
  20. x = x * 10 + c - '0', c = getc(stdin);
  21. }
  22. return x;
  23. }
  24.  
  25. char readChar() {
  26. char c = getc(stdin);
  27. while (c != '?' && c != '!') {
  28. c = getc(stdin);
  29. }
  30. return c;
  31. }
  32.  
  33. inline void writeInt(int x){
  34. char s[15];
  35. int n = 0;
  36. while (x || !n) {
  37. s[n++] = '0' + x % 10, x /= 10;
  38. }
  39. while (n--) {
  40. putc(s[n], stdout);
  41. }
  42. putc('\n', stdout);
  43. }
  44.  
  45.  
  46. typedef long long ll;
  47. typedef long double ld;
  48. typedef unsigned long long ull;
  49.  
  50. const int maxn = 2e5 + 7;
  51. const int inf = 2e9 + 7;
  52. const ll infl = 1e18 + 7;
  53. const long double eps = 1e-9;
  54. const ll mod = 998244353;
  55.  
  56. typedef tree<pair<int, int>, null_type, less<pair<int, int>>, rb_tree_tag, tree_order_statistics_node_update> os;
  57. int a[maxn], b[maxn], arr[maxn];
  58. int pre[maxn];
  59.  
  60. os t[4 * maxn];
  61.  
  62. void build(int v, int tl, int tr) {
  63. if (tl == tr) {
  64. t[v].insert({arr[tl], tl});
  65. return;
  66. }
  67. int tm = (tl + tr) / 2;
  68. build(2 * v, tl, tm);
  69. build(2 * v + 1, tm + 1, tr);
  70. t[v] = t[2 * v];
  71. for (pair<int, int> i : t[2 * v + 1]) {
  72. t[v].insert(i);
  73. }
  74. }
  75.  
  76. void upd(int v, int tl, int tr, int pos, pair<int, int> was, pair<int, int> x) {
  77. t[v].erase(was);
  78. t[v].insert(x);
  79. if (tl == tr) return;
  80. int tm = (tl + tr) / 2;
  81. if (pos <= tm) upd(2 * v, tl, tm, pos, was, x);
  82. else upd(2 * v + 1, tm + 1, tr, pos, was, x);
  83. }
  84.  
  85. int get(int v, int tl, int tr, int l, int r, int lp, int rp) {
  86. if (tl == l && tr == r) {
  87. int rr = t[v].order_of_key({rp + 1, -1});
  88. int ll = t[v].order_of_key({lp, -1});
  89. return rr - ll;
  90. }
  91. int tm = (tl + tr) / 2;
  92. if (r <= tm) return get(2 * v, tl, tm, l, r, lp, rp);
  93. else if (l > tm) return get(2 * v + 1, tm + 1, tr, l, r, lp, rp);
  94. else return get(2 * v, tl, tm, l, tm, lp, rp) + get(2 * v + 1, tm + 1, tr, tm + 1, r, lp, rp);
  95. }
  96.  
  97. int main() {
  98. ios_base::sync_with_stdio(0);
  99. cin.tie(0);
  100. cout.tie(0);
  101. int n = readInt(), m = readInt();
  102. for (int i = 0; i < n; i++) {
  103. int x;
  104. x = readInt();
  105. pre[x] = i;
  106. a[i] = pre[x];
  107. }
  108. for (int i = 0; i < n; ++i) {
  109. int x;
  110. x = readInt();
  111. b[i] = pre[x];
  112. arr[pre[x]] = i;
  113. }
  114. build(1, 0, n - 1);
  115. while (m--) {
  116. int tp;
  117. tp = readInt();
  118. if (tp == 1) {
  119. int l1 = readInt(), r1 = readInt(), l2 = readInt(), r2 = readInt();
  120. writeInt(get(1, 0, n - 1, l1 - 1, r1 - 1, l2 - 1, r2 - 1));
  121. }
  122. else {
  123. int x = readInt(), y = readInt();
  124. --x;
  125. --y;
  126. upd(1, 0, n - 1, b[x], {x, b[x]}, {y, b[x]});
  127. upd(1, 0, n - 1, b[y], {y, b[y]}, {x, b[y]});
  128. swap(b[x], b[y]);
  129. }
  130. }
  131. return 0;
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement