参考了一下第一篇题解的写法,但是对着调了很久没过去,瞪不出来哪里挂了(
#include<bits/stdc++.h>
#define int long long
#define doub long double
#define m_p make_pair
using namespace std;
const int maxn=2e5+7;
int n,m;
int B;
int bc;
int a[maxn];
int bel[maxn];
int tmp[maxn];
int u;
struct qry{
int l,r,id;
}qq[maxn];
int qa[maxn];
bool cmp(qry x,qry y){
if(bel[x.l]==bel[y.l]){
return x.r<y.r;
}
return bel[x.l]<bel[y.l];
}
int lst[maxn];
int fr[maxn];
int clr[maxn];
int cc;
int BF(int l,int r){
static int f[maxn],ans=0;
for(int i=l;i<=r;i++){
f[a[i]]=0;
}
for(int i=l;i<=r;i++){
if(!f[a[i]])f[a[i]]=i;
ans=max(ans,i-f[a[i]]);
}
return ans;
}
signed main(){
// freopen("P5906_2.in","r",stdin);
// freopen("O.out","w",stdout);
cin>>n;
B=sqrt(n);
for(int i=1;i<=n;i++)cin>>a[i],tmp[i]=a[i],bel[i]=(i-1)/B+1;
sort(tmp+1,tmp+n+1);
u=unique(tmp+1,tmp+n+1)-tmp-1;
for(int i=1;i<=n;i++)a[i]=lower_bound(tmp+1,tmp+u+1,a[i])-tmp;
cin>>m;
// cout<<m<<endl;
for(int i=1;i<=m;i++){
cin>>qq[i].l>>qq[i].r;
qq[i].id=i;
}
bc=bel[n];
// cout<<B<<" "<<bc<<" "<<u<<endl;
sort(qq+1,qq+m+1,cmp);
for(int bl=1,i=1;bl<=bc;bl++){
int rb=min(n,bl*B);
int l=rb+1;
int r=l-1;
int ans=0;
for(;bel[qq[i].l]==bl&&i<=m;i++){
if(bel[qq[i].r]==bl){
qa[qq[i].id]=BF(qq[i].l,qq[i].r);
continue;
}
while(r<qq[i].r){
r++;
if(!fr[a[r]]){
fr[a[r]]=r;
clr[++cc]=a[r];
}
lst[a[r]]=r;
ans=max(ans,r-fr[a[r]]);
}
int tp=ans;
while(l>qq[i].l){
l--;
if(lst[a[l]])ans=max(ans,lst[a[l]]-l);
else lst[a[l]]=l;
}
qa[qq[i].id]=ans;
while(l<=rb){
if(lst[a[l]]==l)lst[a[l]]=0;
l++;
}
ans=tp;
}
for(int j=1;j<=cc;j++)fr[clr[j]]=lst[clr[j]]=0;
cc=0;
}
for(int i=1;i<=m;i++)cout<<qa[i]<<endl;
}