string s = Console.ReadLine();
string[] r = s.Split(' ');
int n = int.Parse(r[0]);
int q = int.Parse(r[1]);
s = Console.ReadLine();
r = s.Split(' ');
int[] a = new int[n + 1];
for (int i = 1; i < n + 1; i++)
{
    a[i] = int.Parse(r[i - 1]);
}
int[] rezultatiupita = new int[q];
int p = 0;
for (int i = 0; i < q; i++)
{
    s = Console.ReadLine();
    r = s.Split(' ');
    int levi = int.Parse(r[0]);
    int desni = int.Parse(r[1]);
    rezultatiupita[p++] = najduzipodniz(a, levi, desni);
}
static string binarnizapis(int x)
{
    
    int stepen = 1;
    int z = 0;
    while (stepen <= x) { stepen = stepen * 2; z++; }
    stepen = stepen / 2;
    int[] a = new int[z];
    int i = 0;
    int suma = 0;
    int y = x;
    while (suma != x)
    {
        if (stepen <= y)
        {
            suma += stepen;
            y = y - stepen;
            a[i] = 1;
        }
        stepen = stepen / 2;
        //a[i] = 0;
        i++;
    }
    string s = "";
    for (int j = 0; j < z; j++) s += a[j];
    return s;
    
}
//static int and(int x,int y)
//{
//    string sx = binarnizapis(x);
//    string sy = binarnizapis(y);
//    string s = "";
//    int i = sx.Length;
//    int j = sy.Length;
//    for (int k = Math.Min(i, j) - 1; k >= 0; k--)
//    {
//        if (sx[i - 1 - k] == '1' && sy[j - 1 - k] == '1') s += "1";
//        else s += "0";
//    }
//    int z = s.Length;
//    int rez = 0;
//    int stepen = 1;
//    for(int q=0;q<z;q++)
//    {
        
//        if (s[z - q-1] == '1')
//        {
//            rez += stepen;
//        }
//        stepen = stepen * 2;
//    }
//    return rez;
//}
//static int xor(int x, int y)
//{
//    string sx = binarnizapis(x);
//    string sy = binarnizapis(y);
//    string s = "";
//    int i = sx.Length;
//    int j = sy.Length;
//    if (j > i)
//    {
//        for (int f = 0; f < j - i; f++)
//        {
//            if (sy[f] == '1') s += "1";
//            else s += "0";
//        }
//        for (int f = 0; f < i; f++)
//        {
//            if ((sx[f] == '0' && sy[j - i + f] == '1') || (sx[f] == '1' && sy[j - i + f] == '0')) s += "1";
//            else s += '0';
//        }
//    }
//    else
//    {
//        for (int f = 0; f < i - j; f++)
//        {
//            if (sx[f] == '1') s += "1";
//            else s += "0";
//        }
//        for (int f = 0; f < j; f++)
//        {
//            if ((sx[f] == '0' && sy[i-j + f] == '1') || (sx[f] == '1' && sy[i-j + f] == '0')) s += "1";
//            else s += '0';
//        }
//    }
//    int z = s.Length;
//    int rez = 0;
//    int stepen = 1;
//    for (int q = 0; q < z; q++)
//    {

//        if (s[z - q - 1] == '1')
//        {
//            rez += stepen;
//        }
//        stepen = stepen * 2;
//    }
//    return rez;
//}
//static int brojcifara(int x)
//{
//    int i = 1;
//    int j = 1;
//    while (i <= x) { i = i * 10; j++; }
//    return j - 1;
//}
static int najduzipodniz(int[] a, int levi, int desni)
{
    int max = 0;
    for (int i = levi; i <= desni; i++)
    {
        if (a[i] > max) max = a[i];
    }
    int[] brcifaraubinarnom = new int[binarnizapis(max).Length + 1];
    for (int i = levi; i <= desni; i++)
    {
        brcifaraubinarnom[binarnizapis(a[i]).Length]++;
    }
    int max2 = 0;
    for (int i = 0; i < binarnizapis(max).Length + 1; i++)
    {
        if (brcifaraubinarnom[i] > max2) max2 = brcifaraubinarnom[i];
        
    }
    return max2;
}
for (int i = 0; i < q; i++) Console.WriteLine(rezultatiupita[i]);