感觉问题应该出在连续四个memset上
#include<bits/stdc++.h>
using namespace std;
map<int,int>mp;
int a[1000005];
int b[1000005];
int cnt=0;
struct node{
int l,r,ans,id;
}ask[1000005];
int bl[1000005];
int tmaxn[1000005],tminn[1000005];
int maxn[1000005],minn[1000005];
vector<int>use;
bool cmp(node a,node b){
if(bl[a.l]==bl[b.l])return a.r<b.r;
return bl[a.l]<bl[b.l];
}
int tans,ans=0;
inline void add(int t,bool fl){
if(maxn[a[t]]==-1)maxn[a[t]]=t;
else maxn[a[t]]=max(maxn[a[t]],t);
if(minn[a[t]]==-1)minn[a[t]]=t;
else minn[a[t]]=min(minn[a[t]],t);
if(fl){
tans=max(tans,maxn[a[t]]-minn[a[t]]);
if(tmaxn[a[t]]==-1)tmaxn[a[t]]=t;
else tmaxn[a[t]]=max(tmaxn[a[t]],t);
if(tminn[a[t]]==-1)tminn[a[t]]=t;
else tminn[a[t]]=min(tminn[a[t]],t);
}
ans=max(ans,maxn[a[t]]-minn[a[t]]);
}
bool cmmp(node a,node b){
return a.id<b.id;
}
int bmin[1000005];
int bmax[1000005];
signed main(){
ios::sync_with_stdio(false);
int n;
cin>>n;
for(int i=1;i<=n;i++){
bl[i]=(i+(int)(sqrt(n))-1)/(int)(sqrt(n));
cin>>a[i];
b[i]=a[i];
}
sort(b+1,b+n+1);
for(int i=1;i<=n;i++){
if(!mp[b[i]]){
mp[b[i]]=++cnt;
}
}
for(int i=1;i<=n;i++){
a[i]=mp[a[i]];
}
int m;
cin>>m;
for(int i=1;i<=m;i++){
cin>>ask[i].l>>ask[i].r;
ask[i].id=i;
}
sort(ask+1,ask+m+1,cmp);
int l=1,r=0,nowbl=0,tl;
for(int i=1;i<=m;i++){
if(bl[ask[i].l]==bl[ask[i].r]){
int sum=0;
for(int j=ask[i].l;j<=ask[i].r;j++){
bmax[a[j]]=-1;
bmin[a[j]]=-1;
}
for(int j=ask[i].l;j<=ask[i].r;j++){
if(bmax[a[j]]==-1)bmax[a[j]]=j;
if(bmin[a[j]]==-1)bmin[a[j]]=j;
bmax[a[j]]=max(bmax[a[j]],j);
bmin[a[j]]=min(bmin[a[j]],j);
sum=max(sum,bmax[a[j]]-bmin[a[j]]);
}
ask[i].ans=sum;
continue;
}
if(bl[ask[i].l]!=nowbl){
use.clear();
memset(maxn,-1,sizeof(maxn));
memset(minn,-1,sizeof(minn));
memset(tmaxn,-1,sizeof(tmaxn));
memset(tminn,-1,sizeof(tminn));
nowbl=bl[ask[i].l];
tans=0;
ans=0;
tl=bl[ask[i].l]*(int)(sqrt(n));
l=tl,r=tl-1;
while(r<ask[i].r){
add(++r,1);
}
tans=ans;
}
for(int i=0;i<use.size();i++){
maxn[use[i]]=tmaxn[use[i]];
minn[use[i]]=tminn[use[i]];
}
use.clear();
l=tl;
ans=tans;
while(r<ask[i].r){
add(++r,1);
}
while(l>ask[i].l){
add(--l,0);
use.push_back(a[l]);
}
ask[i].ans=ans;
}
sort(ask+1,ask+m+1,cmmp);
for(int i=1;i<=m;i++){
cout<<ask[i].ans<<"\n";
}
return 0;
}