rt,只过了#1和#17
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 1;
int B, L, R, last;
int n, m, a[N], ans[N], tmp[N];
struct node
{
int id;
int l, r;
}q[N];
unordered_map<int,int> mp;
int first[N], last_pos[N];
bool cmp(node x, node y)
{
if(x.l / B != y.l / B) return x.l < y.l;
return x.r < y.r;
}
void lsh()
{
memcpy(tmp, a, sizeof(a));
sort(tmp + 1, tmp + n + 1);
int cnt = unique(tmp + 1, tmp + n + 1) - tmp - 1;
for(int i = 1; i <= cnt; i++)
mp[tmp[i]] = i;
for(int i = 1; i <= n; i++)
a[i] = mp[a[i]];
return;
}
signed main()
{
cin >> n;
B = sqrt(n);
for(int i = 1; i <= n; i++)
cin >> a[i];
lsh();
cin >> m;
for(int i = 1; i <= m; i++)
{
cin >> q[i].l >> q[i].r;
q[i].id = i;
}
sort(q + 1, q + m + 1, cmp);
L = 1, R = 0, last = -1;
for(int i = 1; i <= m; i++)
{
if(q[i].l / B == q[i].r / B)
{
int res = 0;
for(int j = q[i].l; j <= q[i].r; j++)
{
if(!first[a[j]]) first[a[j]] = j;
else res = max(res, j - first[a[j]]);
}
ans[q[i].id] = res;
for(int j = q[i].l; j <= q[i].r; j++)
first[a[j]] = 0;
}
else
{
if(last != q[i].l / B)
{
memset(first, 0, sizeof(first));
memset(last_pos, 0, sizeof(last_pos));
L = (q[i].l / B + 1) * B;
R = L - 1;
last = q[i].l / B;
}
while(R < q[i].r)
{
R++;
if(!first[a[R]]) first[a[R]] = R;
last_pos[a[R]] = R;
}
int cnt = 0;
for(int j = q[i].l; j <= L - 1; j++)
{
if(!first[a[j]]) first[a[j]] = j;
cnt = max(cnt, last_pos[a[j]] - j);
}
ans[q[i].id] = max(cnt, 0LL);
for(int j = q[i].l; j <= L - 1; j++)
first[a[j]] = 0;
}
}
for(int i = 1; i <= m; i++)
cout << ans[i] << "\n";
return 0;
}