uva 11235
数据结构 RMQ算法 左右左右 写得有点晕了 。。。。。
/************************************************************************* > Author: xlc2845 > Mail: xlc2845@gmail.com > Created Time: 2013年11月07日 星期四 11时05分22秒 ************************************************************************/ #include <cstdio> //#include <iostream> #include <cstring> #include <algorithm> #include <queue> #define LL long long #define maxn 100010 using namespace std; int val[maxn], cou[maxn], n, q, num[maxn], left[maxn], right[maxn], d[maxn][100]; void init() { memset(val, 0, sizeof(val)); memset(cou, 0, sizeof(cou)); memset(d, 0, sizeof(d)); } void init_RMQ(int k) { for(int i = 0; i < k; i++) d[i][0] = cou[i]; for(int j = 1; (1 << j) <= n; j++) for(int i = 0; i+(1 << j) - 1 < n; i++) d[i][j] = max(d[i][j-1], d[i+(1 << (j-1))][j-1]); } int RMQ(int L, int R) { if(L > R) return 0; int k = 0; while((1 << (k+1)) <= R-L+1) k++; return max(d[L][k], d[R-(1 << k)+1][k]); } int main() { while(scanf("%d", &n) == 1 && n) { init(); scanf("%d",&q); int j = 1, x; scanf("%d", &x); left[j] = 1; num[1] = j; val[1] = x; cou[1] = 1; for(int i = 2; i <= n; i++) { scanf("%d", &x); if(x == val[j]) { num[i] = j; cou[j]++; } else { right[j] = i-1; j++; val[j] = x; num[i] = j; cou[j] ++; left[j] = i; } } right[j] = n; init_RMQ(j); while(q--) { int rr,ll; scanf("%d%d", &ll, &rr); int R = num[rr], L = num[ll]; if(R == L) printf("%d\n", rr-ll+1); else { int ans = right[L]-ll+1; ans = max(rr-left[R]+1, ans); ans = max(ans, RMQ(L+1, R-1)); printf("%d\n",ans); } } } return 0; }