Rt,模板题只有14分。
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define pre(i,a,b) for(int i=a;i>=b;i--)
#define N 400005
using namespace std;
int u[N],bas,n,m,o[N],b[N],T,ans[N];
struct node{
int l,r,op;
bool operator<(const node o)const{
if((l-1)/bas!=(o.l-1)/bas)return l<o.l;
return r<o.r;
}
}a[N];
int L[N],R[N],d[N];
int calc(int l,int r){
int mx=0;
rep(i,l,r){
if(d[u[i]])mx=max(mx,i-d[u[i]]);
if(!d[u[i]])d[u[i]]=i;
}
rep(i,l,r)d[u[i]]=0;
return mx;
}
int l,r,mx;
void ins(int x){
if(L[u[x]])mx=max(mx,x-L[u[x]]);
if(!L[u[x]])L[u[x]]=x;
R[u[x]]=x;
}
void clear(int l,int r){
mx=0;rep(i,l,r)L[u[i]]=R[u[i]]=0;
}
int main(){
//freopen("P5906_3.in","r",stdin);
scanf("%d",&n);rep(i,1,n)scanf("%d",&u[i]),o[i]=u[i];
sort(o+1,o+n+1);bas=sqrt(n);
rep(i,1,n)if(o[i]!=o[i-1])b[++T]=o[i];
rep(i,1,n)u[i]=lower_bound(b+1,b+T+1,u[i])-b;
scanf("%d",&m);rep(i,1,m)scanf("%d%d",&a[i].l,&a[i].r),a[i].op=i;
//cout<<"ss"<<endl;
sort(a+1,a+m+1);
//cout<<"tt"<<endl;
l=r=(a[1].l-1)/bas*bas+bas;ins(l);
rep(i,1,m){
//cout<<i<<endl;
if((a[i].l-1)/bas==(a[i].r-1)/bas){ans[a[i].op]=calc(a[i].l,a[i].r);continue;}
int k=min(((a[i].l-1)/bas+1)*bas,n);
//cout<<a[i].l<<" "<<a[i].r<<" "<<k<<endl;
if(i!=1&&(a[i].l-1)/bas!=(a[i-1].l-1)/bas){
clear(l,r);
rep(i,1,T)assert(!L[i]&&!R[i]);
l=r=k+1;ins(l);
}
//cout<<r<<" st "<<a[i].r<<endl;
assert(a[i].l<=k&&k<=a[i].r);
//cout<<a[i].l<<" "<<k<<" "<<a[i].r<<endl;
while(r<a[i].r)ins(++r);
int now=0;
pre(j,k,a[i].l)if(R[u[j]])now=max(now,R[u[j]]-j);
ans[a[i].op]=max(max(mx,now),calc(a[i].l,k));
}
rep(i,1,m)printf("%d \n",ans[i]);
return 0;
}