#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int n,q,cnt;
int a[N],f[N][21],zu[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],f[r-(1<<k)+1][k]);
}
int Cz(int l,int r){//建立一个数组存第i个元素属于第几块
if(zu[l]==zu[r]) return r-l+1;
int zk=st[zu[l]].r-l+1,yk=r-st[zu[r]].l+1,ans=max(zk,yk);
int ks=zu[l],end=zu[r];
if(ks+1==end) return ans;
ks++,end--;
int ans1=maxx(ks,end);
return max(ans1,ans);
}
void init(){
memset(st,0,sizeof st);
memset(zu,0,sizeof zu);
memset(f,0,sizeof f);
}
int main(){
while(1){
n=read();if(n==0) return 0;
q=read();
cnt=0;
int su=1;
init();
a[0]=-100010;
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;
}
zu[i]=cnt;
su++;
}
st[cnt].r=n;
st[cnt].sum=su;
//处理基础信息
for(int i=1;i<=cnt;i++){
f[i][0]=st[i].sum;
}
int k=log2(cnt);
for(int j=1;j<=k;j++){
for(int i=1;i+(1<<j)-1<=cnt;i++){
f[i][j]=max(f[i][j-1],f[i+(1<<j-1)][j-1]);
}
}
for(int i=1;i<q;i++){
int l,r;
l=read(),r=read();
printf("%d\n",Cz(l,r));
}
int l,r;
l=read(),r=read();
printf("%d",Cz(l,r));
}
return 0;
}
/*
*/