#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void Rd(T &x) {
x = 0;
bool f = 0;
char ch = getchar();
while (!isdigit(ch)) f |= ch == '-', ch = getchar();
while (isdigit(ch)) x = (x << 3) + (x << 1) + (ch ^ 48), ch = getchar();
if (f)
x = -x;
}
const int N = 2e5 + 5;
int n, m, a[N], St[N], Ed[N], __St[N], __Ed[N], b[N], L[320], R[320];
int bel[N];
int now, ans[N];
struct P {
int l, r, id;
bool operator < (const P &a) const {
return bel[l] == bel[a.l] ? r < a.r : l < a.l;
}
} Q[N];
int main() {
Rd(n);
int tt = 0;
for (int i = 1; i <= n; ++i) Rd(a[i]), b[++tt] = a[i];
Rd(m);
for (int i = 1; i <= m; ++i) Rd(Q[i].l), Rd(Q[i].r), Q[i].id = i;
sort(b + 1, b + tt + 1);
tt = unique(b + 1, b + tt + 1) - b - 1;
for (int i = 1; i <= n; ++i) a[i] = lower_bound(b + 1, b + tt + 1, a[i]) - b;
int SI = sqrt(n), Bnum = SI;
for (int i = 1; i <= Bnum; ++i) {
L[i] = (i - 1) * SI + 1;
R[i] = i * SI;
}
if (R[Bnum] < n) L[Bnum + 1] = R[Bnum] + 1, R[++Bnum] = n;
for (int i = 1; i <= Bnum; ++i)
for (int j = L[i]; j <= R[i]; ++j) bel[j] = i;
sort(Q + 1, Q + m + 1);
int last_block = 0;
for (int i = 1, l = 1, r = 0; i <= m; ++i) {
if (bel[Q[i].l] == bel[Q[i].r]) {
for (int j = Q[i].l; j <= Q[i].r; ++j) __St[a[j]] = 0;
for (int j = Q[i].l; j <= Q[i].r; ++j) {
if (!__St[a[j]]) __St[a[j]] = j;
ans[Q[i].id] = max(ans[Q[i].id], j - __St[a[j]]);
}
continue;
}
if (last_block != bel[Q[i].l]) {
for (int j = l; j <= r; ++j) St[a[j]] = Ed[a[j]] = 0;
l = R[bel[Q[i].l]] + 1, r = R[bel[Q[i].l]];
now = 0;
last_block = bel[Q[i].l];
}
while (r < Q[i].r) {
++r, Ed[a[r]] = r;
if (St[a[r]]) now = max(now, r - St[a[r]]);
else St[a[r]] = r;
}
int __l = l;
for (int j = Q[i].l; j <= __l; ++j) __Ed[a[j]] = Ed[a[j]];
int tmp = now;
while (__l > Q[i].l) {
--__l, tmp = max(tmp, Ed[a[__l]] - __l);
if (!Ed[a[__l]]) Ed[a[__l]] = __l;
}
for (int j = Q[i].l; j <= l; ++j) Ed[a[j]] = __Ed[a[j]];
ans[Q[i].id] = tmp;
}
for (int i = 1; i <= m; ++i) printf("%d\n", ans[i]);
}
求助大佬为什么只有28。经测试暴力部分正确无误(暴力58分)