1 #include<stdio.h>
 2 #include<math.h>
 3 const int N = 100010;//区间最大长度
 4 const int M = 32;
 5 int d[N][M];//表示从i开始长度为2^j的一段元素中的最小值
 6 int A[N];//元素
 7 int n; //元素从1到n编号
 8 int max(int a, int b) {
 9     return a > b ? a : b;
10 }
11 
12 int RMQ_init() {
13     for(int i = 1; i <= n; ++i) d[i][0] = A[i];
14     for(int j = 1; (1 << j) <= n; ++j)
15         for(int i = 1; i <= n + 1 - (1 << j); ++i)
16             d[i][j] = max(d[i][j - 1], d[i + (1 << (j - 1))][j - 1]);
17 }
18 
19 int RMQ_query(int l, int r) {
20     int k = 0;
21     while(1 << (k + 1) <= r - l + 1) ++k;
22     return max(d[l][k], d[r - (1 << k) + 1][k]);
23 }
24 
25 int left[N], right[N], num[N], a[N];
26 int main() {
27       int m, q, l, r;
28       while(scanf("%d", &m), m) {
29           scanf("%d", &q);
30           n = 0;
31           int count = 1;
32           for(int i = 1; i <= m; ++i) {
33               scanf("%d", &a[i]);
34           }
35           a[m + 1] = a[m] + 1;
36           for(int i = 1; i <= m; ++i) {
37               if(a[i] != a[i + 1]) {
38                   A[++n] = count;
39                   for(int j = i - count + 1; j <= i; ++j) {
40                       left[j] = i - count + 1;
41                       right[j] = i;
42                       num[j] = n;
43                   }
44                   count = 1;
45               }
46               else count++;
47           }
48           RMQ_init();
49           int ql, qr;
50           while(q--) {
51               int ans;
52               scanf("%d%d", &ql, &qr);
53               if(num[ql] == num[qr]) ans = qr - ql + 1;
54               else {
55                   ans = max(right[ql] - ql + 1, qr - left[qr] + 1);
56                   if(num[qr] - num[ql] > 1) ans = max(ans, RMQ_query(num[ql] + 1, num[qr] - 1));
57               }
58               printf("%d\n", ans);
59           }
60       }
61     return 0;
62 }