//c++
#include<bits/stdc++.h>
using namespace std;
const int N=5e6+10;
int n,q,cnt;
int a[N],f[N][30],cl[N];
struct node{
int l,r,sum;// 这个块的左端点,右端点,有几个数
}st[N];//第几个块
inline int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}//快读
int maxx(int l,int r){
int k=log2(r-l+1);
return max(f[l][k-1],f[r-(1<<k)+1][k-1]);
}
int Cz(int l,int r){
int zk,yk,fz=0,fy=0,q=1;
for(int i=1;i<=cnt;i++){
if(st[i].l<=l&&st[i].r>=r) return r-l+1;
if(st[i].l<=l&&st[i].r<r&&fz==0){
zk=st[i].r-l+1;fz=1;
}
if(st[i].l>l&&st[i].r>=r&&fy==0){
yk=r-st[i].l+1;fy=1;
}
if(st[i].l>l&&st[i].r<r){
f[q++][0]=st[i].sum;
}
}
int k=log2(q);
for(int j=1;j<=k;j++){
for(int i=1;i+(1<<j)-1<=q;i++){
f[i][j]=max(f[i][j-1],f[i+(1<<j-1)][j-1]);
}
}
return max(max(zk, yk),maxx(1,q));
}
void init(){
memset(f,0,sizeof f);
memset(a,0,sizeof a);
memset(cl,0,sizeof cl);
memset(st,0,sizeof st);
}
int main(){
while(1){
n=read();if(n==0) return 0;
q=read();
cnt=0;
int su=1;
init();
for(int i=1;i<=n;i++){
a[i]=read();
if(a[i-1]!=a[i]){
st[cnt].sum=su;
su=0;
st[cnt++].r=i-1;
st[cnt].l=i;
}
su++;
}
st[cnt].r=n;
st[cnt].sum=su;
//处理基础信息
while(q--){
int l,r;
l=read(),r=read();
printf("%d\n",Cz(l,r));
}
}
return 0;
}
莫名TLE,孩子已经调傻了