const int N=3e5+5;
int n,m;
int i,j,k;
int a[N];
struct Node
{
int l,r;
int sum;
}T[N*40];
int root[N],tot=0;
void update(int l,int r,int &x,int y,int pos)
{
T[++tot]=T[y];
T[tot].sum++;
x=tot;
if(l==r) return ;
int mid=l+r>>1;
if(mid>=pos) update(l,mid,T[x].l,T[y].l,pos);
else update(mid+1,r,T[x].r,T[y].r,pos);
}
int query(int l,int r,int x,int y,int k)
{
if(l==r)
{
if(T[y].sum-T[x].sum>k) return T[y].sum-T[x].sum;
else return 0;
}
int L=T[T[y].l].sum-T[T[x].l].sum ;
int R=T[T[y].r].sum-T[T[x].r].sum ;
int mid=l+r>>1;
if(L>k) return query(l,mid,T[x].l,T[y].l,k);
else if(R>k) return query(mid+1,r,T[x].r,T[y].r,k);
else return 0;
}
int main()
{
//IOS;
while(~sdd(n,m)){
for(int i=1;i<=n;i++) sd(a[i]);
for(int i=1;i<=n;i++) update(1,n,root[i],root[i-1],a[i]);
for(int i=1;i<=m;i++){
int l,r;
sdd(l,r);
int len=r-l+1;
if(len%2) len=(len/2)+1;
else len=len/2;
int ans=query(1,n,root[l-1],root[r],len); //3
//dbg(ans);
if(ans==0) puts("1");
else{
int res=(r-l+1)-ans; //2
if(ans<=2*res){
pd(ans-res);
} else{
pd(res+ans-2*res);
}
}
}
}
//PAUSE;
return 0;
}