#include <iostream>
#include <algorithm>
#include <cmath>
#include <map>
using namespace std;
const int N=2e5+5;
map<int,int>mp;
int n,m,len,a[N],b[N],ans[N];
struct opt{ int l,r,id; }t[N];
int cmp(opt x,opt y){ return b[x.l]==b[y.l]?x.r<y.r:x.l<y.l; }
int c[N],d[N],e[N],mx,s[N],top;
int calc(int l,int r){
int ret=0;
for(int i=l;i<=r;i++)
c[a[i]]=c[a[i]]?c[a[i]]:i,ret=max(ret,i-c[a[i]]);
for(int i=l;i<=r;i++)
c[a[i]]=0;
return ret;
}
void add1(int x){
if(!e[a[x]]) s[++top]=a[x];
c[a[x]]=c[a[x]]?c[a[x]]:x,e[a[x]]=x;
mx=max(mx,x-c[a[x]]);
}
void add2(int x){
d[a[x]]=d[a[x]]?d[a[x]]:x;
mx=max(mx,max(e[a[x]],d[a[x]])-x);
}
int main(){
scanf("%d",&n);
int tot=0;
for(int i=1;i<=n;i++){
scanf("%d",a+i);
if(!mp[a[i]]) mp[a[i]]=++tot;
a[i]=mp[a[i]];
}
scanf("%d",&m);
for(int i=1;i<=m;i++)
scanf("%d%d",&t[i].l,&t[i].r),t[i].id=i;
len=sqrt(n);
for(int i=1;i<=n;i++)
b[i]=(i-1)/len+1;
sort(t+1,t+1+m,cmp);
for(int i=1;i<=m;){
int now=b[t[i].l];
int l=now*len+1,r=now*len;
mx=0;
for(;b[t[i].l]==now;i++){
int u=t[i].l,v=t[i].r;
if(b[u]==b[v]){
ans[t[i].id]=calc(u,v);
continue;
}
while(r<v) add1(++r);
int tmp=mx;
while(l>u) add2(--l);
ans[t[i].id]=mx;
mx=tmp;
for(;l<=now*len;l++) d[a[l]]=0;
}
while(top) c[s[top]]=e[s[top--]]=0;
}
for(int i=1;i<=m;i++)
printf("%d\n",ans[i]);
return 0;
}
这份代码可以通过本题,但是将
while(top) c[s[top]]=e[s[top--]]=0;
改为:
while(top) e[s[top]]=c[s[top--]]=0;
却只有 28pts,记录。
并且两份代码本地都能过第四个数据点。