本地第四个样例点跑了30s+,答案是对的
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m;
ll a[214514];
int len;
struct Q
{
int l,r;
int id;
} q[214514];
struct Node
{
int l,r;
int cnt;
} ;
unordered_map<ll,Node> st,un;
int rn,cnt;
int res,op;
int ans[214514];
vector<int> v,vv;
inline bool cmp(Q a,Q b)
{
if((a.l-1)/len!=(b.l-1)/len) return a.l<b.l;
return a.r<b.r;
}
inline void MER()
{
for(int i=1;i<=m;i++)
{
int l=q[i].l,r=q[i].r;
int ls=(l-1)/len+1,rs=(r-1)/len+1;
if(ls==rs)
{
st.clear();
res=0;
for(int j=l;j<=r;j++)
{
if(!st[a[j]].cnt)
{
st[a[j]].cnt=1;
st[a[j]].l=j;
st[a[j]].r=j;
}
else
{
res=max(res,j-st[a[j]].l);
st[a[j]].r=j;
}
}
/*for(int i=v.size()-1;i>=0;i--)
{
st[v[i]].cnt=0;
st[v[i]].l=0;
st[v[i]].r=0;
v.pop_back();
}*/
ans[q[i].id]=res;
}
else
{
if(cnt!=ls+1)
{
st.clear();
/*for(int i=v.size()-1;i>=0;i--)
{
st[v[i]].cnt=0;
st[v[i]].l=0;
st[v[i]].r=0;
v.pop_back();
}*/
res=0;
cnt=ls+1;
rn=ls*len;
}
while(rn<r)
{
rn++;
if(!st[a[rn]].cnt)
{
st[a[rn]].cnt=1;
st[a[rn]].l=rn;
st[a[rn]].r=rn;
// v.push_back(a[rn]);
}
else
{
res=max(res,rn-st[a[rn]].l);
st[a[rn]].r=rn;
}
}
/*for(int i=vv.size()-1;i>=0;i--)
{
un[vv[i]].cnt=0;
un[vv[i]].l=0;
un[vv[i]].r=0;
vv.pop_back();
}*/
un.clear();
op=res;
for(int j=l;j<=ls*len;j++)
{
if(!un[a[j]].cnt&&!st[a[j]].cnt)
{
un[a[j]].cnt=1;
un[a[j]].l=j;
un[a[j]].r=j;
//vv.push_back(a[i]);
}
else if(st[a[j]].cnt)
{
op=max(op,st[a[j]].r-j);
}
else
{
op=max(op,j-un[a[j]].l);
un[a[j]].r=j;
}
}
ans[q[i].id]=op;
}
}
}
int main()
{
//freopen("P5906_4.in","r",stdin);
//freopen("P5906.out","w",stdout);
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n;
len=sqrt(n);
for(int i=1;i<=n;i++)
cin>>a[i];
cin>>m;
for(int i=1;i<=m;i++)
{
cin>>q[i].l>>q[i].r;
q[i].id=i;
}
sort(q+1,q+1+m,cmp);
MER();
for(int i=1;i<=m;i++)
cout<<ans[i]<<'\n';
return 0;
}