过了前三个点和最后一个点。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=4e5+10;
int n,m,ind,ans,a[N],b[N],h[N],t[N],h2[N],t2[N],out[N];
int B,nl[N],nr[N],pos[N];
struct que
{
int lb,rb,id;
bool operator <(const que x) const
{
if(pos[lb]==pos[x.lb])
{
return rb<x.rb;
}
return lb<x.lb;
}
};
que q[N];
signed main()
{
int lst,x;
cin>>n;
B=sqrt(n);
for(int i=1;i<=n;i++)
{
cin>>a[i];
b[++ind]=a[i];
}
sort(b+1,b+1+ind);
ind=unique(b+1,b+1+ind)-b-1;
for(int i=1;i<=n;i++)
{
a[i]=upper_bound(b+1,b+1+ind,a[i])-b-1;
pos[i]=(i+B-1)/B;
}
for(int i=1;i<=n/B;i++)
{
nl[i]=(i-1)*B+1;
nr[i]=i*B;
}
if(nr[n/B]<n)
{
nl[n/B+1]=nr[n/B]+1;
nr[n/B+1]=n;
}
cin>>m;
for(int i=1;i<=m;i++)
{
cin>>q[i].lb>>q[i].rb;
q[i].id=i;
}
sort(q+1,q+1+m);
lst=0;
for(int i=1,l=1,r=0;i<=m;i++)
{
// cout<<":::"<<q[i].lb<<" "<<q[i].rb<<"\n";
if(pos[q[i].lb]==pos[q[i].rb])
{
x=0;
for(int j=q[i].lb;j<=q[i].rb;j++)
{
if(!h2[a[j]])
{
h2[a[j]]=j;
}
t2[a[j]]=max(t2[a[j]],j);
x=max(x,t2[a[j]]-h2[a[j]]);
}
for(int j=q[i].lb;j<=q[i].rb;j++)
{
h2[a[j]]=t2[a[j]]=0;
}
out[q[i].id]=x;
continue;
}
if(pos[q[i].lb]!=lst)
{
for(int j=l;j<=r;j++)
{
h2[a[j]]=t2[a[j]]=0;
}
ans=0;
l=nr[pos[q[i].lb]]+1;
r=nr[pos[q[i].lb]];
lst=pos[q[i].lb];
}
while(r<q[i].rb)
{
r++;
if(!h[a[r]])
{
h[a[r]]=r;
}
t[a[r]]=max(t[a[r]],r);
ans=max(ans,t[a[r]]-h[a[r]]);
}
x=ans;
while(l>q[i].lb)
{
l--;
if(!t2[a[l]])
{
t2[a[l]]=l;
}
ans=max(ans,max(t2[a[l]],t[a[l]])-l);
}
out[q[i].id]=ans;
ans=x;
for(int j=l;j<=nr[pos[q[i].lb]];j++)
{
t2[a[j]]=0;
}
l=nr[pos[q[i].lb]]+1;
}
for(int i=1;i<=m;i++)
{
cout<<out[i]<<"\n";
}
}