GerONSo

Untitled

Jan 5th, 2021
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.33 KB | None | 0 0
  1. #define pragma
  2.  
  3. #ifdef pragma
  4. //#pragma GCC optimize("O3")
  5. // #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
  6. #endif // pragma
  7.  
  8. #include<bits/stdc++.h>
  9. #include <ext/pb_ds/assoc_container.hpp>
  10. #include <ext/pb_ds/tree_policy.hpp>
  11.  
  12. #define ll long long
  13. #define all(x) begin(x), end(x)
  14. #define pb push_back
  15. #define x first
  16. #define y second
  17. // #define int long long
  18. #define zero(two) memset(two, 0, sizeof(two))
  19.  
  20. using namespace std;
  21. using namespace __gnu_pbds;
  22.  
  23.  
  24. typedef vector<int> vi;
  25. typedef vector<bool> vb;
  26. typedef pair<int, int> pii;
  27. typedef long double ld;
  28. typedef vector<vi> matrix;
  29. template<typename T>
  30. using kawaii_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
  31.  
  32. const ld PI = atan2(0, -1);
  33.  
  34. void seriy() {
  35. ios::sync_with_stdio(0);
  36. cin.tie(0);
  37. cout.tie(0);
  38. // cout << fixed << setprecision(10);
  39. #ifdef _offline
  40. freopen("input.txt", "r", stdin);
  41. freopen("output.txt", "w", stdout);
  42. #endif
  43. }
  44.  
  45. const int MAXN = 3e5 + 10;
  46. const int MAXM = 600;
  47. const int INF = 1e9 + 7;
  48. const int MOD = 998244353;
  49. const int MAXLOG = 24;
  50.  
  51. struct node {
  52. int val = 0;
  53. node *left = nullptr;
  54. node *right = nullptr;
  55.  
  56. node() {
  57.  
  58. }
  59.  
  60. node(int vl, node *lft, node *rght) {
  61. val = vl;
  62. left = lft;
  63. right = rght;
  64. }
  65. };
  66.  
  67. vi a;
  68.  
  69. void build(node *v, int tl, int tr) {
  70. if(tl == tr) {
  71. return;
  72. }
  73. int tm = (tl + tr) >> 1;
  74. v->left = new node();
  75. v->right = new node();
  76. build(v->left, tl, tm);
  77. build(v->right, tm + 1, tr);
  78. }
  79.  
  80. int get(node *v, int tl, int tr, int l, int r) {
  81. if(tl > r || tr < l) {
  82. return 0;
  83. }
  84. if(tl >= l && tr <= r) {
  85. return v->val;
  86. }
  87. int tm = (tl + tr) >> 1;
  88. if(v->left == nullptr) {
  89. v->left = new node();
  90. }
  91. if(v->right == nullptr) {
  92. v->right = new node();
  93. }
  94. int left = get(v->left, tl, tm, l, r);
  95. int right = get(v->right, tm + 1, tr, l, r);
  96. return left + right;
  97. }
  98.  
  99. void update(node *v, node *v2, int tl, int tr, int pos, int val) {
  100. if(tl == tr) {
  101. v->val = val;
  102. return;
  103. }
  104. int tm = (tl + tr) >> 1;
  105. if(pos <= tm) {
  106. v->right = v2->right;
  107. v->left = new node();
  108. update(v->left, v2->left, tl, tm, pos, val);
  109. }
  110. else {
  111. v->left = v2->left;
  112. v->right = new node();
  113. update(v->right, v2->right, tm + 1, tr, pos, val);
  114. }
  115. // if(v == nullptr) v = new node();
  116. if(v->left == nullptr) v->left = new node();
  117. if(v->right == nullptr) v->right = new node();
  118. v->val = v->left->val + v->right->val;
  119. // cerr << tl << " " << tr << '\n';
  120. }
  121.  
  122. signed main() {
  123. seriy();
  124. int n, m;
  125. cin >> n >> m;
  126. a.resize(n);
  127. for(int i = 0; i < n; i++) {
  128. cin >> a[i];
  129. }
  130. vector<node*> roots(n + 1);
  131. roots[0] = new node();
  132. build(roots[0], 1, n + 1);
  133. vi last(m + 1, -1);
  134. for(int i = 1; i <= n; i++) {
  135. roots[i] = new node();
  136. // cerr << i << '\n'
  137. update(roots[i], roots[i - 1], 1, n + 1, i, 1);
  138. node *cur = new node();
  139. cur->val = roots[i]->val;
  140. cur->left = roots[i]->left;
  141. cur->right = roots[i]->right;
  142. // cerr << i << " " << 1 << '\n';
  143. if(last[a[i - 1]] != -1) {
  144. roots[i] = new node();
  145. // cerr << last[a[i - 1]] << " " << -1 << '\n';
  146. update(roots[i], cur, 1, n + 1, last[a[i - 1]], 0);
  147. }
  148. // cerr << '\n';
  149. last[a[i - 1]] = i;
  150. }
  151. int q;
  152. cin >> q;
  153. int p = 0;
  154. for(int i = 0; i < q; i++) {
  155. int x, y;
  156. cin >> x >> y;
  157. int l = (x + p) % n + 1;
  158. int k = (y + p) % m + 1;
  159. // cout << l << " " << k << '\n';
  160. int tl = l - 1, tr = n + 1;
  161. while(tr - tl > 1) {
  162. int mid = (tr + tl) >> 1;
  163. int right = get(roots[mid], 1, n + 1, l, mid);
  164. // cout << l << " " << mid << " " << right << '\n';
  165. // cout << mid << " " << right - left << '\n';
  166. if(right >= k) {
  167. tr = mid;
  168. }
  169. else {
  170. tl = mid;
  171. }
  172. }
  173. p = ((tr == n + 1) ? 0 : tr);
  174. cout << p << '\n';
  175. }
  176. return 0;
  177. }
Advertisement
Add Comment
Please, Sign In to add comment