题目:https://loj.ac/p/10121
#include<bits/stdc++.h>
#define int long long
using namespace std;
int dp[200005][32], a[200005], n, m, lg[200005], mp[10000007];
void init()
{
for(int i=1;i<=n;i++)
{
dp[i][0]=min(i-mp[a[i]],dp[i-1][0]+1);
mp[a[i]]=i;
}
lg[0]=-1;
for(int i=1;i<=n;i++)
{
lg[i]=lg[i>>1]+1;
}
for(int j=1;(1<<j)<=n;j++)
{
for(int i=1;i+(1<<j)-1<=n;i++)
{
dp[i][j]=max(dp[i][j-1],dp[i+(1<<j-1)][j-1]);
}
}
}
signed main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
a[i]+=1e6;
}
init();
for(int i=1;i<=m;i++)
{
int x, y, lt, rt;
cin>>x>>y;
x++,y++;
lt=x,rt=y+1;
while(lt+1<rt)
{
int mid=(lt+rt)>>1;
if(mid-dp[mid][0]+1<=x)
{
lt=mid;
}
else
{
rt=mid;
}
}
int mi=lg[y-rt+1];
cout<<max(rt-x,max(dp[rt][mi],dp[y-(1<<mi)+1][mi]))<<"\n";
}
}