#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;


int main()
{
    int n,q;
    cin >> n >> q;

    vector<int> niz(n);
    map<tuple<int, int>, int> prefiksi;

    for(int i =0;i<n;i++)
    {
        cin >> niz[i];
    }// unos

    int isto=0;
    int hor=0;
    for(int i =0;i<n;i++)
    {
        for(int j =i;j<n;j++)
        {
            prefiksi[{i,j}]=0;
            isto=niz[i]&niz[j];
            hor=niz[i]^niz[j];

            prefiksi[{i,j}]+=(isto>hor)+prefiksi[{i,j-1}];
            cout << i << " " << j << " ->" << prefiksi[{i,j}] << "\n";
        }
        cout << endl;
    }

    int pocetak, kraj, maks=0, trenutni=0;
    while(q>0)// sva pitanja
    {
        cin >> pocetak >> kraj;
        // nakon svakog unosa idemo da vidimo koj je
        pocetak--;
        kraj--;// gledam sve prefikse izmedju ovih kordinata
        maks=0;
        for(int i = pocetak;i<=kraj;i++)
        {
            maks=max(maks,prefiksi[{i,kraj}]);// koristim to sto je na nacin koje sam slagao prefikse
            // maskimum je uvek neki prvi prefiks i zadji, zbog sabiranja
        }
        cout << maks << "\n";

        q--;
    }



    return 0;

}