下下来数据之后比对发现是对的,结果交上去就全部输出 0 了。
const int MAXN=2e5+10;
int N,M,Val[MAXN],Uni,Cnt;
int Lst[MAXN],Nxt[MAXN],ans[MAXN],St[MAXN];
struct query
{
int l,r,id;
bool operator<(const query &x) const
{
if(l/Uni!=x.l/Uni) return l<x.l;
return r<x.r;
}
}Q[MAXN];
int Ch[MAXN],Tot,Nums[MAXN];
inline int calc(int l,int r)
{
int res=0;
for(int i=l;i<=r;++i) Lst[Val[i]]=0;
for(int i=l;i<=r;++i)
if(!Lst[Val[i]]) Lst[Val[i]]=i;
else res=std::max(res,i-Lst[Val[i]]);
return res;
}
inline int get(int x)
{
return (x/Uni)+1;
}
inline void Solve()
{
std::sort(Q+1,Q+1+M);
for(int i=1,j=1;j<=Cnt;++j)
{
int br=std::min(N,j*Uni),l=br+1,r=l-1,res=0;
Tot=0;
for(;get(Q[i].l)==j;++i)
{
auto q=Q[i];
if(get(q.r)==j)
{
ans[q.id]=calc(q.l,q.r);
continue;
}
while(r<q.r)
{
++r;Nxt[Val[r]]=r;
if(!St[Val[r]]) St[Val[r]]=r,Ch[++Tot]=Val[r];
res=std::max(res,r-St[Val[r]]);
}
int backup=res;
while(l>q.l)
{
--l;
if(Nxt[Val[l]]) res=std::max(res,Nxt[Val[l]]-l);
else Nxt[Val[l]]=l;
}
ans[q.id]=res;
while(l<=br)
{
if(Nxt[Val[l]]==l) Nxt[Val[l]]=0;
++l;
}
res=backup;
}
for(int i=1;i<=Tot;++i) Nxt[Ch[i]]=St[Ch[i]]=0;
}
}
int main()
{
// freopen("backup_mo_algo.in","r",stdin);
// freopen("backup_mo_algo.out","w",stdout);
read(N);
for(int i=1;i<=N;++i) read(Val[i]),Nums[i]=Val[i];
std::sort(Nums+1,Nums+1+N);
int len=std::unique(Nums+1,Nums+1+N)-Nums-1;
for(int i=1;i<=N;++i) Val[i]=std::lower_bound(Nums+1,Nums+1+len,Val[i])-Nums;
read(M);
Uni=std::sqrt(N);
Cnt=(N-1)/Uni+1;
for(int i=1;i<=M;++i)
{
read(Q[i].l,Q[i].r);
Q[i].id=i;
}
Solve();
for(int i=1;i<=M;++i) write(ans[i]),puts("");
return 0;
}
/*
8
1 6 2 2 3 3 1 6
5
1 4
2 5
2 8
5 6
1 7
*/