Advertisement
Guest User

Untitled

a guest
Sep 19th, 2019
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.04 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 uint unsigned int
  6. #define ld long double
  7. #define ll long long
  8. #define ull unsigned long long
  9. #define F first
  10. #define S second
  11. #define pb push_back
  12. #define sqr(x) (x) * (x)
  13.  
  14. using namespace std;
  15. using namespace __gnu_pbds;
  16.  
  17. mt19937 gen(time(0));
  18.  
  19. const int maxn = 1048576;
  20.  
  21. int inf = 1e9 + 7;
  22.  
  23. struct segtree
  24. {
  25. int T[maxn * 2];
  26. int mx[maxn * 2];
  27. int lazy[maxn * 2];
  28. segtree()
  29. {
  30. for(int i = 0; i < maxn * 2; ++i)
  31. mx[i] = -inf;
  32. }
  33. void update(int v, int tl, int tr, int p, int x)
  34. {
  35. if (tl == tr)
  36. {
  37. T[v] = x;
  38. mx[v] = x;
  39. return;
  40. }
  41. int mid = (tl + tr) / 2;
  42. if (p <= mid) update(v << 1, tl, mid, p, x);
  43. else update(v << 1 | 1, mid + 1, tr, p, x);
  44. T[v] = min(T[v << 1], T[v << 1 | 1]);
  45. mx[v] = max(mx[v << 1], mx[v << 1 | 1]);
  46. return;
  47. }
  48. int query(int v, int tl, int tr, int l, int r)
  49. {
  50. if (tr < l || tl > r) return inf;
  51. if (tl >= l && tr <= r) return T[v];
  52. int mid = (tl + tr) / 2;
  53. return min(query(v << 1, tl, mid, l, r),
  54. query(v << 1 | 1, mid + 1, tr, l, r));
  55. }
  56.  
  57. //ubrat
  58. int binleft(int v, int tl, int tr, int p, int x)
  59. {
  60. if (tl == tr)
  61. {
  62. if (tl <= p && mx[v] >= x)
  63. return tl;
  64. else
  65. return -1;
  66. }
  67. int mid = (tl + tr) / 2;
  68. int ans = -1;
  69. if (p >= mid + 1 && mx[v << 1 | 1] >= x)
  70. ans = binleft(v << 1 | 1, mid + 1, tr, p, x);
  71. if (p >= tl && mx[v << 1] >= x && ans == -1)
  72. ans = binleft(v << 1, tl, mid, p, x);
  73. return ans;
  74. }
  75.  
  76. int binright(int v, int tl, int tr, int p, int x)
  77. {
  78. if (tl == tr)
  79. {
  80. if (tl >= p && mx[v] >= x)
  81. return tl;
  82. else
  83. return -1;
  84. }
  85. int mid = (tl + tr) / 2;
  86. int ans = -1;
  87. if (p <= mid && mx[v << 1] >= x)
  88. ans = binright(v << 1, tl, mid, p, x);
  89. if (p <= tr && mx[v << 1 | 1] >= x && ans == -1)
  90. ans = binright(v << 1 | 1, mid + 1, tr, p, x);
  91. return ans;
  92. }
  93. };
  94.  
  95. segtree t1, t2;
  96.  
  97. int main()
  98. {
  99. #ifdef LOCAL
  100. freopen("input.txt", "r", stdin);
  101. freopen("output.txt", "w", stdout);
  102. #else
  103. freopen("input.txt", "r", stdin);
  104. freopen("output.txt", "w", stdout);
  105. #endif
  106. ios_base::sync_with_stdio(false);
  107. cin.tie(0);
  108. cout.tie(0);
  109. int n, m, q;
  110. cin >> n >> m >> q;
  111. for(int i = 0; i < q; ++i)
  112. {
  113. int t;
  114. cin >> t;
  115. if(t == 1)
  116. {
  117. int r;
  118. cin >> r;
  119. --r;
  120. t1.update(1, 0, maxn - 1, r, i + 1);
  121. }
  122. if(t == 2)
  123. {
  124. int c;
  125. cin >> c;
  126. --c;
  127. t2.update(1, 0, maxn - 1, c, i + 1);
  128. }
  129. if (t == 3)
  130. {
  131. int ans = inf;
  132. int r1, c1, r2, c2, k;
  133. cin >> r1 >> c1 >> r2 >> c2 >> k;
  134. --r1;
  135. --r2;
  136. --c1;
  137. --c2;
  138.  
  139. {
  140. vector <pair <pair <int, int>, int>> vc1;
  141. vector <pair <pair <int, int>, int>> vc2;
  142. vc1.pb({{r1, c1}, 0});
  143. vc2.pb({{r2, c2}, 0});
  144. {
  145. bool f1 = false;
  146. bool f2 = false;
  147. if (i + 1 - t2.T[c1 + maxn] <= k) f1 = true;
  148. if (i + 1 - t2.T[c2 + maxn] <= k) f2 = true;
  149. int R1 = t1.binleft(1, 0, maxn - 1, r1 - 1, i + 1 - k);
  150. int R2 = t1.binright(1, 0, maxn - 1, r1 + 1, i + 1 - k);
  151. int RR1 = t1.binleft(1, 0, maxn - 1, r2 - 1, i + 1 - k);
  152. int RR2 = t1.binright(1, 0, maxn - 1, r2 + 1, i + 1 - k);
  153. if (R1 > -1 && f1) vc1.pb({{R1, c1}, r1 - R1});
  154. if (R2 > -1 && f1) vc1.pb({{R2, c1}, R2 - r1});
  155. if (RR1 > -1 && f2) vc2.pb({{RR1, c2}, r2 - RR1});
  156. if (RR2 > -1 && f2) vc2.pb({{RR2, c2}, RR2 - r2});
  157. }
  158. {
  159. bool f1 = false;
  160. bool f2 = false;
  161. if (i + 1 - t1.T[r1 + maxn] <= k) f1 = true;
  162. if (i + 1 - t1.T[r2 + maxn] <= k) f2 = true;
  163. int C1 = t2.binleft(1, 0, maxn - 1, c1 - 1, i + 1 - k);
  164. int C2 = t2.binright(1, 0, maxn - 1, c1 + 1, i + 1 - k);
  165. int CC1 = t2.binleft(1, 0, maxn - 1, c2 - 1, i + 1 - k);
  166. int CC2 = t2.binright(1, 0, maxn - 1, c2 + 1, i + 1 - k);
  167. if (C1 > -1 && f1) vc1.pb({{r1, C1}, c1 - C1});
  168. if (C2 > -1 && f1) vc1.pb({{r1, C2}, C2 - c1});
  169. if (CC1 > -1 && f2) vc2.pb({{r2, CC1}, c2 - CC1});
  170. if (CC2 > -1 && f2) vc2.pb({{r2, CC2}, CC2 - c2});
  171. }
  172. for(int j = 0; j < int(vc1.size()); ++j)
  173. for(int jj = 0; jj < int(vc2.size()); ++jj)
  174. {
  175. int R1 = vc1[j].F.F;
  176. int C1 = vc1[j].F.S;
  177. int R2 = vc2[jj].F.F;
  178. int C2 = vc2[jj].F.S;
  179. int dep = vc1[j].S + vc2[jj].S + abs(R1 - R2) + abs(C1 - C2);
  180. if ((i + 1 - t1.T[R1 + maxn] <= k && i + 1 - t2.T[C2 + maxn] <= k) || (i + 1 - t2.T[C1 + maxn] <= k && i + 1 - t1.T[R2 + maxn] <= k) ||
  181. i + 1 - t1.query(1, 0, maxn - 1, min(R1, R2), max(R1, R2)) <= k || i + 1 - t2.query(1, 0, maxn - 1, min(C1, C2), max(C1, C2)) <= k)
  182. ans = min(ans, dep);
  183. }
  184. }
  185.  
  186. if (ans == inf) cout << "-1\n";
  187. else cout << ans << '\n';
  188. }
  189. }
  190. return 0;
  191. }
  192. //
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement