1 #include <stdio.h> 2 int d[100005][50]; 3 int max(int a,int b) 4 { 5 if (a>b) return(a); 6 return(b); 7 } 8 int rmq(int l,int r) 9 { 10 int k=0; 11 while ((1<<(k+1))<=r-l+1) k++; 12 return(max(d[l][k],d[r-(1<<k)+1][k])); 13 } 14 int main() 15 { 16 int a[100005],k,n,i,j,p,q,x,y,sum,count[100005],num[100005],right[100005],left[100005]; 17 while (~scanf("%d",&n)&&n!=0) 18 { 19 scanf("%d",&k); 20 for (i=1;i<=n;i++) scanf("%d",&a[i]); 21 a[0]=1000001; sum=0; 22 for (i=1;i<=n;i++) 23 if (a[i]==a[i-1]) 24 { 25 count[sum]++; 26 num[i]=sum; 27 } 28 else 29 { 30 right[sum]=i-1; 31 sum++; 32 left[sum]=i; 33 count[sum]=1; 34 num[i]=sum; 35 } 36 right[sum]=n; 37 38 for (i=1;i<=sum;i++) d[i][0]=count[i]; 39 for (j=1;(1<<j)<=sum;j++) 40 for (i=1;i+(1<<j)-1<=sum;i++) 41 d[i][j]=max(d[i][j-1],d[i+(1<<(j-1))][j-1]); 42 43 for (i=1;i<=k;i++) 44 { 45 scanf("%d%d",&p,&q); 46 if (num[p]==num[q]) {printf("%d\n",q-p+1);continue;} 47 x=max(right[num[p]]-p+1,q-left[num[q]]+1); 48 if (right[num[p]]+1==left[num[q]]) y=0; else 49 y=rmq(num[p]+1,num[q]-1); 50 printf("%d\n",max(x,y)); 51 } 52 } 53 return(0); 54 }
http://acm.hdu.edu.cn/showproblem.php?pid=1806