/*
* Author: Geeza
*/

#include <bits/stdc++.h>

#define ld long double
#define ll long long
#define pb push_back
#define fin(a, n) for(int i = a; i < n; i++)
#define fjn(a, n) for(int j = a; j < n; j++)
#define all(a) a.begin(),a.end()
#define allr(a) a.rbegin(),a.rend()
#define FAST ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)

using namespace std;

const double PI = acos(-1);
const int N = 1e7+10;
const ll oo = 0x3f3f3f3f3f3f3f3f;
const int mod = 1000000007, inf = 1e6;

string di[] = {"D","L", "U", "R", "UL", "UR", "DL", "DR"};
int dx[] = {+1, +0, +0, -1, -1, -1, +1, +1};
int dy[] = {+0, -1, +1, +0, -1, +1, -1, +1};
char dc[] = {'D', 'L', 'R', 'U'};

struct node {
    ll leftVal, rightVal, leftFreq, rightFreq, bst, len;
    node() {leftVal = rightVal = 0, leftFreq = rightFreq = bst = len = 0;}
    node(ll x) {leftVal = rightVal = x, leftFreq = rightFreq = bst = len = 1;}
};

struct segTree {
    ll treeSize;
    vector<node> tree;

    segTree(ll n) {
        treeSize = 1;
        while (treeSize < n) treeSize <<= 1;
        tree.resize(2 * treeSize, node());
    }

    node merge(node l, node r) {
        if (l.len == 0) return r;
        if (r.len == 0) return l;

        node parent = node();
        parent.len = l.len + r.len;
        parent.leftVal = l.leftVal;
        parent.rightVal = r.rightVal;
        parent.leftFreq = l.leftFreq;

        if (l.leftFreq == l.len && l.rightVal == r.leftVal) parent.leftFreq += r.leftFreq;
        parent.rightFreq = r.rightFreq;
        if (r.rightFreq == r.len && l.rightVal == r.leftVal) parent.rightFreq += l.rightFreq;
        parent.bst = max(l.bst, r.bst);
        if (l.rightVal == r.leftVal) parent.bst = max(parent.bst, l.rightFreq + r.leftFreq);
        return parent;
    }

    void build(vector<ll> &v, ll i, ll l, ll r) {
        if (r-l == 1) {
            if (l < v.size()) tree[i] = node(v[l]);
            return;
        }

        ll mid = l+(r-l)/2;
        build(v, 2*i+1, l, mid);
        build(v, 2*i+2, mid, r);
        tree[i] = merge(tree[2*i+1], tree[2*i+2]);
    }

    void build(vector<ll> &v) {
        build(v, 0, 0, treeSize);
    }

    node query(ll l, ll r, ll i, ll lx, ll rx) {
        if (lx >= r || rx <= l) return node();
        if (lx >= l && rx <= r) return tree[i];

        ll mid = (lx + rx) / 2;

        node left = query(l, r, 2*i+1, lx, mid);
        node right = query(l, r, 2*i+2, mid, rx);
        return merge(left, right);
    }

    ll query(ll l, ll r) {
        return query(l, r, 0, 0, treeSize).bst;
    }
};
ll n, q;
void solve() {
    vector<ll> v(n);
    fin(0, n) cin >> v[i];
    segTree st(n);
    st.build(v);

    while (q--) {
        ll l, r; cin >> l >> r; l--;
        cout << st.query(l, r) << "\n";
    }
}

int main() {
#ifndef ONLINE_JUDGE
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
#endif
    int tt = 1; //cin >> tt;
    while(cin >> n){
        if (n == 0) break;
        cin >> q;
        solve();
    }
    return 0;
}