fork download
  1. // ROOT : DRAGON3012009
  2. #include <bits/stdc++.h>
  3. #define ll int
  4. #define ld long double
  5. #define el "\n"
  6. #define fast ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  7. #define __ROOT__ int main()
  8. #pragma GCC optimize("O2")
  9. #define FOR(i,l,r) for(int i = l ; i <= r ; i ++)
  10. #define FORD(i,r,l) for(int i = r ; i >= l ; i --)
  11. #define REP(i, a ) for(int i = 0 ; i < a ; i ++ )
  12. #define fi first
  13. #define se second
  14. #define M 1000000007
  15. #define MAXN 300001
  16. #define INF (1ll<<30)
  17. #define BLOCK_SIZE 425
  18. #define MAX_NODE 1001001
  19. #define LOG 19
  20. #define ALPHA_SIZE 26
  21. #define BASE 311
  22. #define NAME "file"
  23. #define compare(v) sort((v).begin(), (v).end()); (v).erase(unique((v).begin(), (v).end()), (v).end());
  24. using namespace std;
  25. const ll MOD[] = {(ll)1e9 + 2277, (ll)1e9 + 5277, (ll)1e9 + 8277, (ll)1e9 + 9277, (ll) 1e9 + 7 };
  26. const ll NMOD = 1;
  27. const int dx[] = {-1, 0, 1,0};
  28. const int dy[] = {0, 1, 0, -1};
  29. //**Variable**//
  30. ll n, num_block, last_ans = 0, q ;
  31. ll arr[MAXN];
  32. ll cnt[MAXN] ;
  33. ll b[MAXN] ;
  34. vector<ll> pos[MAXN] ;
  35. ll mode[MAXN / BLOCK_SIZE][MAXN / BLOCK_SIZE ] ;
  36. //**Struct**//
  37.  
  38. //**Function**//
  39. template<class X, class Y >
  40. bool minimize(X & x, const Y &y ) {
  41. return x > y ? x = y, 1:0 ;
  42. }
  43. template<class X, class Y >
  44. bool maximize(X &x, const Y &y ) {
  45. return x < y ? x = y, 1:0 ;
  46. }
  47. void prepare() {
  48. FOR(i, 0, num_block) { // cur_block
  49. memset(cnt, 0, sizeof cnt) ;
  50. ll ma = 0 ;
  51. FOR(j,min( i*BLOCK_SIZE,n ), n ) {
  52. cnt[arr[j]] ++ ;
  53. maximize(ma, cnt[arr[j]] );
  54. mode[i][j/BLOCK_SIZE] = ma ;
  55. }
  56. }
  57. memset(cnt, 0, sizeof cnt) ;
  58. }
  59. ll query(ll l, ll r) {
  60. ll ans = 0 ;
  61. ll blockL = l / BLOCK_SIZE, blockR = r / BLOCK_SIZE ;
  62. if(blockL == blockR ) {
  63. FOR(i, l, r ) cnt[arr[i]] ++, maximize(ans, cnt[arr[i]] ) ;
  64. FOR(i , l , r) cnt[arr[i]] -- ;
  65. } else {
  66. ans = mode[blockL+ 1 ][blockR - 1 ] ;
  67. for(ll i = l ; i / BLOCK_SIZE == blockL ; i ++ ) {
  68. if(ans < pos[arr[i]].size()) {
  69. ll temp = 0 ;
  70. temp = upper_bound(pos[arr[i]].begin(), pos[arr[i]].end(), r ) - lower_bound(pos[arr[i]].begin(), pos[arr[i]].end(), l ) ;
  71. maximize(ans, temp) ;
  72. }
  73. }
  74. for(ll i = r ; i / BLOCK_SIZE == blockR ; i -- ) {
  75. if(ans < pos[arr[i]].size()) {
  76. ll temp = 0 ;
  77. temp = upper_bound(pos[arr[i]].begin(), pos[arr[i]].end(), r ) - lower_bound(pos[arr[i]].begin(), pos[arr[i]].end(), l ) ;
  78. maximize(ans, temp) ;
  79. }
  80. }
  81. }
  82. return ans ;
  83. }
  84. void init() {
  85. cin>>n >> q;
  86. num_block = n / BLOCK_SIZE ;
  87. FOR(i,1, n) cin >> arr[i] ;
  88. FOR(i, 1, n) {
  89. b[i] = pos[arr[i]].size() ;
  90. pos[arr[i]].push_back(i) ;
  91. }
  92. prepare() ;
  93. }
  94.  
  95. void solve() {
  96. FOR(i, 1, q) {
  97. ll x, y ;
  98. cin >> x >> y ;
  99. x = (x + last_ans )% n + 1 ;
  100. y = (y + last_ans )% n + 1 ;
  101. if(x > y ) swap(x, y) ;
  102. last_ans = query(x, y) ;
  103. cout << last_ans << el;
  104. }
  105. }
  106.  
  107. __ROOT__ {
  108. // freopen(NAME".inp" , "r" , stdin);
  109. // freopen(NAME".out" , "w", stdout) ;
  110. fast;
  111. int t =1 ;// cin >> t;
  112. while(t-- ) {
  113. init();
  114. solve();
  115. }
  116. }
Success #stdin #stdout 0.01s 13876KB
stdin
Standard input is empty
stdout
Standard output is empty