Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2019
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.42 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <string>
  5. #include <cmath>
  6. #include <cstdio>
  7. #include <queue>
  8. #include <deque>
  9. #include <bitset>
  10. #include <set>
  11. #include <unordered_set>
  12. #include <map>
  13. #include <unordered_map>
  14. #include <random>
  15. #include <ctime>
  16. #include <utility>
  17. #include <fstream>
  18.  
  19. #pragma GCC optimize("Ofast")
  20. #pragma GCC optimize("no-stack-protector")
  21. #pragma GCC optimize("unroll-loops")
  22. #pragma GCC target("sse,sse2,sse3,ssse3,popcnt,abm,mmx,tune=native")
  23. #pragma GCC optimize("fast-math")
  24. #pragma comment(linker, "/STACK:256000000")
  25. #pragma warning(disable:4996)
  26.  
  27. using namespace std;
  28.  
  29. typedef long long ll;
  30. typedef long double ld;
  31.  
  32. const int inf = 1e9;
  33. const ll llinf = 1e18, mod = 1000'000'007ll;
  34. const ld pi = 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825;
  35.  
  36. #define forn(i, n) for (int i = 0; i < (int)n; ++i)
  37. #define firn(i, n) for (int i = 1; i < (int)n; ++i)
  38. #define all(v) v.begin(), v.end()
  39.  
  40. template<typename T> bool uin(T &a, T b) { if (b < a) { a = b; return 1; } return 0; }
  41. template<typename T> bool uax(T &a, T b) { if (b > a) { a = b; return 1; } return 0; }
  42. template<class iterator> void output(iterator begin, iterator end, char p = ' ', ostream & out = cout) { while (begin != end) { out << (*begin) << p; begin++; } out << '\n'; }
  43. template<class T> void output(T x, char p = ' ', ostream & out = cout) { output(all(x), p, out); }
  44.  
  45. mt19937 rnd(time(NULL));
  46.  
  47. int n;
  48. int cnt[500'001], sq[710], pos[500'001];
  49. void add(int a) {
  50. if (!cnt[a]) sq[pos[a]]--;
  51. cnt[a]++;
  52. }
  53. void del(int a) {
  54. cnt[a]--;
  55. if (!cnt[a]) sq[pos[a]]++;
  56. }
  57. int ansv() {
  58. int i = 0;
  59. for (; ; ++i)
  60. if (sq[i]) break;
  61. int j = 0, k = i * 710;
  62. for (; ; ++j)
  63. if (cnt[k + j] == 0) break;
  64. return j + k;
  65. }
  66. struct otr {
  67. int l, r, t, i;
  68. };
  69. int tt;
  70. bool operator < (const otr & a, const otr & b) {
  71. if ((a.l / tt) != (b.l / tt))
  72. return a.l < b.l;
  73. if ((a.t / tt) != (b.t / tt))
  74. return a.t < b.t;
  75. if (1 & (a.t / tt))
  76. return a.r < b.r;
  77. return a.r > b.r;
  78. }
  79. struct chn {
  80. int p, prev, x;
  81. };
  82. signed main() {
  83. ios_base::sync_with_stdio(false);
  84. cin.tie(NULL);
  85. int q;
  86. cin >> n >> q;
  87. tt = (int)pow((ld)n / 1.5, 0.66667);
  88. vector<int> a(n), b(n);
  89. forn(i, n) cin >> a[i], b[i] = a[i];
  90. vector<otr> ot;
  91. vector<chn> ch;
  92. vector<int> ans(q, -1);
  93. int time = 0;
  94. forn(i, q) {
  95. char tmp;
  96. cin >> tmp;
  97. if (tmp == '?') {
  98. int l, r;
  99. cin >> l >> r;
  100. l--; r--;
  101. ot.push_back(otr{ l, r, time, i });
  102. }
  103. else {
  104. int j, x;
  105. cin >> j >> x;
  106. j--;
  107. ch.push_back(chn{ j, b[j], x });
  108. b[j] = x;
  109. time++;
  110. }
  111. }
  112. sort(all(ot));
  113. int l = 0, r = -1, t = 0;
  114. forn(i, n + 1) pos[i] = i / 710, sq[i / 710]++;
  115. int p;
  116. forn(i, ot.size()) {
  117. for (; l > ot[i].l; --l) add(a[l - 1]);
  118. for (; r < ot[i].r; ++r) add(a[r + 1]);
  119. for (; l < ot[i].l; ++l) del(a[l]);
  120. for (; r > ot[i].r; --r) del(a[r]);
  121. for (; t < ot[i].t; ++t) {
  122. p = ch[t].p;
  123. if (p < l || p > r) {
  124. a[p] = ch[t].x;
  125. }
  126. else {
  127. del(a[p]);
  128. a[p] = ch[t].x;
  129. add(a[p]);
  130. }
  131. }
  132. for (; t > ot[i].t; --t) {
  133. p = ch[t - 1].p;
  134. if (p < l || p > r) {
  135. a[p] = ch[t - 1].prev;
  136. }
  137. else {
  138. del(a[p]);
  139. a[p] = ch[t - 1].prev;
  140. add(a[p]);
  141. }
  142. }
  143. ans[ot[i].i] = ansv();
  144. }
  145. forn(i, q)
  146. if (ans[i] > -1) cout << ans[i] << '\n';
  147. #ifdef _DEBUG
  148. system("pause");
  149. #endif
  150. return 0;
  151. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement