Advertisement
Galebickosikasa

Untitled

Oct 12th, 2020
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.68 KB | None | 0 0
  1. // #pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
  2. // #pragma GCC target("sse,sse2,sse3,ssse3,sse4,sse4.1,sse4.2,popcnt,abm,mmx,avx")
  3. // #pragma comment(linker, "/stack:200000000"]
  4.  
  5. #include <iostream>
  6. #include <vector>
  7. #include <cmath>
  8. #include <algorithm>
  9. #include <unordered_set>
  10. #include <unordered_map>
  11. #include <set>
  12. #include <map>
  13. #include <queue>
  14. #include <deque>
  15. #include <bitset>
  16. #include <stack>
  17. #include <random>
  18. #include <fstream>
  19. #include <sstream>
  20. #include <chrono>
  21.  
  22. #define fi first
  23. #define se second
  24. #define pb push_back
  25. #define ll long long
  26. #define ld long double
  27. #define hm unordered_map
  28. #define pii pair<int, int>
  29. #define sz(a) (int)a.size()
  30. #define all(a) a.begin(), a.end()
  31. #define cinv(v) for (auto& x: v) cin >> x
  32. #define fr(i, n) for (int i = 0; i < n; ++i)
  33. #define fl(i, l, n) for (int i = l; i < n; ++i)
  34.  
  35. #define int ll
  36.  
  37. template <typename T1, typename T2> inline bool chkmin(T1 &x, const T2 &y) {if (x > y) {x = y; return 1;} return 0;}
  38. template <typename T1, typename T2> inline bool chkmax(T1 &x, const T2 &y) {if (x < y) {x = y; return 1;} return 0;}
  39.  
  40. using namespace std;
  41.  
  42. #ifdef __LOCAL
  43. #define dbg(x) cerr << #x << " : " << x << '\n'
  44. const int maxn = 20;
  45. #else
  46. #define dbg(x)
  47. const int maxn = 1e5 + 5;
  48. #endif
  49.  
  50. //tg: @galebickosikasa
  51.  
  52. ostream& operator << (ostream& out, vector<int>& v) {
  53. for (auto& x: v) out << x << ' ';
  54. return out;
  55. }
  56.  
  57. ostream& operator << (ostream& out, pii& v) {
  58. out << v.fi << ", " << v.se;
  59. return out;
  60. }
  61.  
  62. istream& operator >> (istream& in, pii& a) {
  63. in >> a.fi >> a.se;
  64. return in;
  65. }
  66.  
  67. const ll inf = (ll) 2e9;
  68. const ld pi = asin (1) * 2;
  69. const ld eps = 1e-8;
  70. const ll mod = (ll)1e9 + 7;
  71. const ll ns = 97;
  72. const int maxm = 50 + 5;
  73.  
  74. mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
  75.  
  76. set <int> kek[maxm];
  77. int l[maxn], r[maxn], k;
  78.  
  79. struct tree {
  80. vector<int> t, assign;
  81. int size = 0, capacity;
  82.  
  83. tree (int n) {
  84. while ((1<<size) < n) ++size;
  85. ++size;
  86. size = (1<<size);
  87. capacity = (size>>1);
  88. t = vector<int> (size);
  89. assign = vector<int> (size);
  90. fl (i, n, capacity) t[i + capacity] = inf;
  91. for (int i = capacity - 1; i > 0; --i) t[i] = min (t[i * 2], t[i * 2 + 1]);
  92. }
  93.  
  94. void push (int cur) {
  95. assign[cur * 2] += assign[cur];
  96. assign[cur * 2 + 1] += assign[cur];
  97. assign[cur] = 0;
  98. }
  99.  
  100. void render (int cur) {
  101. t[cur] = min (t[cur * 2] + assign[cur * 2], t[cur * 2 + 1] + assign[cur * 2 + 1]);
  102. }
  103.  
  104. void add (int cur, int left, int right, int l, int r, int x) {
  105. if (cur >= size) return;
  106. if (left > r || right < l) return;
  107. if (l <= left && r >= right) {
  108. assign[cur] += x;
  109. } else {
  110. push (cur);
  111. add (cur * 2, left, (left + right) / 2, l, r, x), add (cur * 2 + 1, (left + right) / 2 + 1, right, l, r, x);
  112. render (cur);
  113. }
  114. }
  115.  
  116. void add (int l, int r, int x) {
  117. add (1, 0, capacity - 1, l, r, x);
  118. }
  119.  
  120. int get (int i) {
  121. int j = i;
  122. i += capacity;
  123. i >>= 1;
  124. vector<int> tmp;
  125. while (i) {
  126. tmp.pb (i);
  127. i >>= 1;
  128. }
  129. reverse (all (tmp));
  130. for (auto& x: tmp) push (x);
  131. return t[j] + assign[j];
  132. }
  133.  
  134. int get () {
  135. return t[1] + assign[1];
  136. }
  137. };
  138.  
  139. signed main () {
  140. ios_base::sync_with_stdio(false);
  141. cin.tie(nullptr);
  142. cout.tie(nullptr);
  143. for (auto& x: l) x = inf;
  144. int n, q;
  145. cin >> n >> k >> q;
  146. vector<int> goo (n);
  147. cinv (goo);
  148. tree moo (n);
  149. for (int i = n - 1; i >= 0; --i) {
  150. int x = goo[i];
  151. kek[x].insert (i);
  152. int mx = i;
  153. fl (j, 1, k + 1) {
  154. auto it = kek[j].begin ();
  155. if (it == kek[j].end ()) mx = inf;
  156. else chkmax (mx, *it);
  157. }
  158. if (mx != inf) {
  159. moo.add (i, i, mx);
  160. chkmax (r[mx], i);
  161. chkmin (l[mx], i);
  162. } else {
  163. moo.add (i, i, inf);
  164. }
  165. dbg (mx);
  166. }
  167. dbg (moo.t);
  168. dbg (moo.assign);
  169. while (q--) {
  170. int t;
  171. cin >> t;
  172. if (t == 1) {
  173. int a, i;
  174. cin >> a >> i;
  175. --i;
  176. int prev = goo[i];
  177. int L = l[i], R = r[i];
  178. if (L <= R) {
  179. auto it = kek[prev].upper_bound (i);
  180. if (it == kek[prev].end ()) {
  181. int tmp = moo.get (R);
  182. moo.add (L, R, inf - tmp);
  183. } else {
  184. int j = *it;
  185. moo.add (L, R, j - i);
  186. chkmin (l[j], l[i]);
  187. chkmax (r[j], r[i]);
  188. }
  189. }
  190. dbg (moo.t);
  191. dbg (moo.assign);
  192. kek[prev].erase (i);
  193. kek[a].insert (i);
  194. l[i] = inf;
  195. r[i] = 0;
  196. if (L <= R) {
  197. int mx = i;
  198. fl (j, 1, k + 1) {
  199. auto it = kek[j].lower_bound (i);
  200. if (it != kek[j].end ()) chkmax (mx, *it);
  201. else mx = inf;
  202. }
  203. if (mx == inf) {
  204. int tmp = moo.get (R);
  205. moo.add (L, R, inf - tmp);
  206. } else {
  207. moo.add (L, R, mx - i);
  208. chkmin (l[mx], l[i]);
  209. chkmax (r[mx], r[i]);
  210. }
  211. }
  212. {
  213. auto it = kek[a].upper_bound (i);
  214. if (it != kek[a].end ()) {
  215. L = l[*it], R = r[*it];
  216. if (L <= R) {
  217. l[*it] = i + 1;
  218. moo.add (L, R, -(*it - R));
  219. int mx = R;
  220. fl (j, 1, k + 1) {
  221. auto it = kek[j].lower_bound (R);
  222. if (it != kek[j].end ()) chkmax (mx, *it);
  223. else mx = inf;
  224. }
  225. if (mx == inf) {
  226. int tmp = moo.get (R);
  227. moo.add (L, R, inf - tmp);
  228. } else {
  229. moo.add (L, R, mx - R);
  230. chkmin (l[mx], l[i]);
  231. chkmax (r[mx], r[i]);
  232. }
  233. }
  234. }
  235. }
  236. {
  237. int mx = i;
  238. fl (j, 1, k + 1) {
  239. auto it = kek[j].lower_bound (i);
  240. if (it != kek[j].end ()) chkmax (mx, *it);
  241. else mx = inf;
  242. }
  243. if (mx == inf) {
  244. int tmp = moo.get (i);
  245. moo.add (i, i, inf - tmp);
  246. } else {
  247. moo.add (i, i, mx - i);
  248. chkmin (l[mx], l[i]);
  249. chkmax (r[mx], r[i]);
  250. }
  251. }
  252. goo[i] = a;
  253. } else {
  254. cout << moo.get () + 1 << '\n';
  255. }
  256. }
  257.  
  258.  
  259.  
  260.  
  261.  
  262.  
  263.  
  264.  
  265.  
  266. }
  267.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement