#include "stdio.h"
#include "math.h"
#include "string.h"
#include "algorithm"
using namespace std;
const int maxn = 100005;
int n,m,x,y,ans;
int num[maxn];
struct node
{
int mmax,lmax,rmax;
int ln,rn;
}tree[maxn<<2];
void PushUp( int rt )
{
tree[rt].ln = tree[rt<<1].ln;
tree[rt].rn = tree[rt<<1|1].rn;
tree[rt].mmax = max( tree[rt<<1].mmax,tree[rt<<1|1].mmax );
tree[rt].lmax = tree[rt<<1].lmax;
tree[rt].rmax = tree[rt<<1|1].rmax;
if( tree[rt<<1].rn == tree[rt<<1|1].ln )
{
tree[rt].mmax = max( tree[rt].mmax,tree[rt<<1].rmax + tree[rt<<1|1].lmax );
if( tree[rt<<1].ln == tree[rt<<1|1].ln )
tree[rt].lmax = tree[rt<<1].lmax + tree[rt<<1|1].lmax;
if( tree[rt<<1].rn == tree[rt<<1|1].rn )
tree[rt].rmax = tree[rt<<1].rmax + tree[rt<<1|1].rmax;
}
}
void BuildTree( int rt,int ld,int rd )
{
if( ld == rd )
{
tree[rt].mmax = tree[rt].lmax = tree[rt].rmax = 1;
tree[rt].ln = tree[rt].rn = num[ld];
return;
}
int mid = (ld+rd)>>1;
BuildTree( rt<<1,ld,mid );
BuildTree( rt<<1|1,mid+1,rd );
PushUp( rt );
}
int query( int rt,int ld,int rd )
{
if( x <= ld && rd <= y )
{
return tree[rt].mmax;
}
if( x > rd || y < ld ) return 0;
int mid = ( ld+rd )>>1;
int Max = max( query( rt<<1,ld,mid ),query( rt<<1|1,mid+1,rd ));
if( tree[rt<<1].rn == tree[rt<<1|1].ln && x <= mid && y > mid )
{
Max = max( Max,min( tree[rt<<1].rmax,mid-x+1 ) + min( tree[rt<<1|1].lmax,y-mid) );
}
return Max;
}
int main()
{
//freopen("data.txt","r",stdin);
while( scanf("%d",&n) != EOF,n )
{
scanf("%d",&m);
for( int i = 1; i <= n; i ++ )
{
scanf("%d",&num[i]);
}
BuildTree( 1,1,n );
for( int i = 1; i <= m; i ++ )
{
scanf("%d%d",&x,&y);
ans = 0;
printf("%d\n",query( 1,1,n ));
}
}
return 0;
}