@@ -3,20 +3,20 @@ const int b = 318; //!< sqrt(1e5)
33// ! https://noshi91.hatenablog.com/entry/2020/10/26/140105
44struct mode_query {
55 int n;
6- vi a, cnt, index_into_index ;
7- vector<vi> index ;
6+ vi a, cnt, pos_idx ;
7+ vector<vi> pos ;
88 vector<vector<pii>>
99 mode_blocks; // !< {mode, cnt} of range of blocks
1010 // ! @param a compressed array: 0 <= a[i] < n
1111 // ! @time O(n * sqrt(n))
1212 // ! @space O(n)
1313 mode_query (const vi& a):
14- n (sz(a)), a(a), cnt(n), index_into_index (n), index (n),
14+ n (sz(a)), a(a), cnt(n), pos_idx (n), pos (n),
1515 mode_blocks ((n + b - 1 ) / b,
1616 vector<pii>((n + b - 1 ) / b)) {
1717 rep (i, 0 , n) {
18- index_into_index [i] = sz (index [a[i]]);
19- index [a[i]].push_back (i);
18+ pos_idx [i] = sz (pos [a[i]]);
19+ pos [a[i]].push_back (i);
2020 }
2121 for (int start = 0 ; start < n; start += b) {
2222 int mode = a[start];
@@ -51,17 +51,17 @@ struct mode_query {
5151 for (int i = l / b * b + b - 1 ; i >= l; i--)
5252 cnt[a[i]]++;
5353 for (int i = l / b * b + b - 1 ; i >= l; i--) {
54- int idx = index_into_index [i];
55- if (idx + res.second < sz (index [a[i]]) &&
56- index [a[i]][idx + res.second ] < r)
54+ int idx = pos_idx [i];
55+ if (idx + res.second < sz (pos [a[i]]) &&
56+ pos [a[i]][idx + res.second ] < r)
5757 res = {a[i], cnt[a[i]] + res.second };
5858 cnt[a[i]]--;
5959 }
6060 rep (i, (r - 1 ) / b * b, r) cnt[a[i]]++;
6161 rep (i, (r - 1 ) / b * b, r) {
62- int idx = index_into_index [i];
62+ int idx = pos_idx [i];
6363 if (idx >= res.second &&
64- index [a[i]][idx - res.second ] >= l)
64+ pos [a[i]][idx - res.second ] >= l)
6565 res = {a[i], cnt[a[i]] + res.second };
6666 cnt[a[i]]--;
6767 }
0 commit comments