#include "sequence.h"
#include <iostream>
#include <vector>
#include <cmath>
#include<map>
#include <algorithm>
#include <iomanip>
#include <string>
#include<stack>
#include <set>
#include <queue>
#include <chrono>
#include<array>
#include<bitset>
#include<unordered_map>
#include<random>
#include<cassert>
#include<cstring>
using namespace std;
using ll = long long;
using db = double;
const float pi = 3.14159265359;
#define V vector
#define VI V<int>
#define P pair<int,int>
#define rep(i, a, b, step) for (int i = int(a); i <= int(b); i += step)
#define repl(i,a,b,step) for (int i = int(a); i >= int(b); i -= step)
#define prime(n) [](int x) { for (int i = 2; i *1ll* i <= x; ++i) if (x % i == 0) return false; return x > 1; }(n)
#define printall(container, ch) for (const auto& elem : container) { std::cout << elem << ch; } std::cout << std::endl;
#define sn << '\n'
#define ed << endl
#define sz size()
#define print cout <<
#define debug(x) cerr<< #x << " = " << x sn;
#define mpII map<int,int>
#define mine min_element
#define maxe max_element
#define all(v) begin(v), end(v)
#define txt freopen("snakes.in", "r", stdin); freopen("snakes.out", "w", stdout)
#define MEX(a) [](VI a){set<int>elem;for(auto&i:a)elem.insert(i);int ret=0;while(elem.count(ret))ret++;return ret;}(a)
#define pb push_back
#define pq priority_queue
#define rev reverse
#define nuyn(a) a.erase(unique(all(a)), end(a))
#define nx next_permutation
#define pk pop_back()
#define START print "Start" sn
#define END print "End" sn
#define ff first
#define ss second
#define ts to_string
#define ub upper_bound
#define mk make_pair
#define lb lower_bound
#define testcase int t;cin>>t;while(t--)solution();
int sequence(int n, std::vector<int> a) {
int mx = *maxe(all(a)), l, r, md, ans = 0;
V<VI>ind(mx + 1), pref(mx + 1, VI(n + 1));
rep(i, 0, n - 1, 1) {
ind[a[i]].pb(i);
rep(j, 1, mx, 1)pref[j][i + 1] = pref[j][i];
pref[a[i]][i + 1]++;
}
auto norm = [&](int el, int l, int r)->bool {
int c1 = 0, c2 = 0, cnt;
rep(i, 1, mx, 1) {
cnt = pref[i][r + 1] - pref[i][l];
if (i < el)c1 += cnt;
else if (i > el)c2 += cnt;
}
return max(c1, c2) * 2 <= r - l + 1;
};
bool ok;
rep(i, 1, mx, 1) {
l = 0;
r = ind[i].sz + 1;
while (l + 1 < r) {
md = r + l >> 1;
ok = 0;
rep(j, 0, ind[i].sz - md, 1)if (norm(i, ind[i][j], ind[i][j + md - 1])) {
ok = 1;
break;
}
if (ok)l = md;
else r = md;
}
ans = max(ans, l);
}
return ans;
}