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 }
浙公网安备 33010602011771号