int n, lim, x, ans; int a[kMaxN], cnt[kMaxN] = {0};
voidsolve_big(int y){ staticint sum[kMaxN], pos[kMaxN * 2]; std::fill_n(pos, 2 * n + 1, 1e9); pos[n] = 0; for (int i = 1; i <= n; ++i) { sum[i] = sum[i - 1]; if (a[i] == x) ++sum[i]; elseif (a[i] == y) --sum[i]; if (pos[sum[i] + n] == 1e9) pos[sum[i] + n] = i; else ans = std::max(ans, i - pos[sum[i] + n]); } }
voidsolve_big(){ for (int i = 1; i <= n; ++i) { if (cnt[i] > lim && i != x) { solve_big(i); } } }
voidsolve_small(){ for (int c = 1; c <= lim; ++c) { staticint cnt[kMaxN] = {0}, ccnt[kMaxN] = {0}; std::fill_n(cnt, n + 1, 0); std::fill_n(ccnt, n + 1, 0); ccnt[0] = n;
for (int l = 1, r = 0; l <= n; --ccnt[cnt[a[l++]]--]) { for (; r < n && !ccnt[c + 1]; ++ccnt[++cnt[a[++r]]]) {} if (ccnt[c + 1]) --ccnt[cnt[a[r--]]--]; assert(!ccnt[c + 1]); if (ccnt[c] >= 2) ans = std::max(ans, r - l + 1); } } }
voiddickdreamer(){ std::cin >> n; for (int i = 1; i <= n; ++i) { std::cin >> a[i]; ++cnt[a[i]]; if (cnt[a[i]] > cnt[x]) x = a[i]; } lim = sqrtl(n); solve_big(), solve_small(); std::cout << ans << '\n'; }