rt
话说这样例是不是太弱了 我忘给询问分块样例也能过样例
/*
***
还要继续努力
成为一名烤咕学家哦
***
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=2e5+5;
ll n,m,a[N],len,l,r,sum,vst[N],cnt,ans[N],lst[N],nxt[N],lsh[N],qaq,qwq;
struct Question{ll l,r,id,pos;}q[N];
template <typename T> void rd(T &x){
ll fl=1;x=0;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') fl=-fl;
for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0';
x*=fl;
}
void wr(ll x){
if(x<0) x=-x,putchar('-');
if(x<10) putchar(x+'0');
if(x>9) wr(x/10),putchar(x%10+'0');
}
bool cmp(Question x,Question y){
if(x.pos!=y.pos) return x.pos<y.pos;
return x.r<y.r;
}
ll solve(ll l,ll r){
ll up[N]={0},tot=0;
for(ll i=l;i<=r;i++){if(!up[a[i]]) up[a[i]]=i;tot=max(tot,i-up[a[i]]);}
return tot;
}
void update(ll x,ll op){
if(op==1){
nxt[a[x]]=x;
if(!lst[a[x]]) lst[a[x]]=x,vst[++cnt]=x;
sum=max(sum,x-lst[a[x]]);
}
else{if(!nxt[a[x]]) nxt[a[x]]=x;sum=max(sum,nxt[a[x]]-x);}
}
void erase(ll x){if(nxt[a[x]]==x) nxt[a[x]]=0;}
int main(){
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
rd(n);len=(ll)sqrt(n);
for(ll i=1;i<=n;i++) rd(a[i]),lsh[i]=a[i];
rd(m);
for(ll i=1;i<=m;i++) rd(q[i].l),rd(q[i].r),q[i].id=i,q[i].pos=(q[i].l-1)/len+1;
sort(lsh+1,lsh+n+1);
qaq=unique(lsh+1,lsh+n+1)-lsh-1;
for(ll i=1;i<=n;i++) a[i]=lower_bound(lsh+1,lsh+qaq+1,a[i])-lsh;
sort(q+1,q+m+1,cmp);
for(ll i=1,j=1;j<=(n-1)/len+1;j++){
for(ll k=1;k<=cnt;k++) lst[a[vst[i]]]=nxt[a[vst[i]]]=0;
ll br=min(j*len,n);l=br+1,r=br,sum=cnt=0;
while(q[i].pos==j){
if(q[i].r<=br){
ans[q[i].id]=solve(q[i].l,q[i].r);i++;
continue;
}
while(r<q[i].r) ++r,update(r,1);
qwq=sum;
while(l>q[i].l) --l,update(l,-1);
ans[q[i].id]=sum;
while(l<=br) erase(l),l++;
sum=qwq;i++;
}
}
for(ll i=1;i<=m;i++) wr(ans[i]),puts("");
return 0;
}