func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long maxn = 2e6 + 100;   const long long inf = 0x3f3f3f3f;   const long long iinf = 1 << 30;   const long long linf = 2e18;   const long long mod = 998244353;   const double eps = 1e-7;   template <class T = long long>   T chmin(T &a, T b) {     return a = min(a, b);   }   template <class T = long long>   T chmax(T &a, T b) {     return a = max(a, b);   }   template <class T = long long>   inline void red(T &x) {     x -= mod, x += x >> 31 & mod;   }   template <class T = long long>   T read() {     T f = 1, a = 0;     char ch = getchar();     while (!isdigit(ch)) {       if (ch ==  - ) f = -1;       ch = getchar();     }     while (isdigit(ch)) {       a = (a << 3) + (a << 1) + ch -  0 ;       ch = getchar();     }     return a * f;   }   long long n, sqrt_n = 300;   long long ans, val;   long long a[maxn], cnt[maxn], sum[maxn], t[maxn], cnt1[maxn], cnt2[maxn];   vector<long long> pos;   void modify(long long x, long long pos) {     cnt2[cnt1[x]]--;     cnt1[x] += pos;     cnt2[cnt1[x]]++;   }   signed main() {     n = read();     for (long long i = (1); i <= (n); ++i) a[i] = read(), cnt[a[i]]++;     long long maxx = 0, tot = 0, val = 0;     for (long long i = (1); i <= (n); ++i) {       if (cnt[i] == maxx) tot++;       if (cnt[i] > maxx) tot = 1, maxx = cnt[i], val = i;     }     if (tot > 1) {       printf( %lld n , n);       return 0;     }     for (long long i = (1); i <= (n); ++i)       if (cnt[i] > sqrt_n && i != val) pos.push_back(i);     for (long long i : pos) {       for (long long j = (1); j <= (n); ++j)         sum[j] = sum[j - 1] + (a[j] == i ? -1 : (a[j] == val ? 1 : 0));       for (long long j = (-n); j <= (n); ++j) t[j + n] = linf;       t[n] = 0;       for (long long j = (1); j <= (n); ++j) {         if (t[sum[j] + n] != linf)           chmax(ans, j - t[sum[j] + n]);         else           t[sum[j] + n] = j;       }     }     for (long long i = (1); i <= (sqrt_n); ++i) {       for (long long j = (1); j <= (n); ++j) cnt1[j] = cnt2[j] = 0;       long long l = 1, r = 0;       while (r < n) {         modify(a[++r], 1);         while (cnt1[a[r]] > i) modify(a[l++], -1);         if (cnt2[i] >= 2) chmax(ans, r - l + 1);       }     }     printf( %lld n , ans);     return 0;   }   