#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; const int maxn=1e5+10; int n,dp[maxn][20],A[maxn],arr[maxn]; void ST(){ for(int i=1;i<=n;i++){ dp[i][0]=A[i]; } for(int j=1;(1<<j)<=n;j++){ for(int i=1;i+(1<<j)-1<=n;i++){ dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]); } } } int RMQ(int l,int r){ if(l>r) return 0; int k=floor(log((double)(r-l+1))/log(2.0)); // while((1<<k+1)<=r-l+1) // k++; return max(dp[l][k],dp[r-(1<<k)+1][k]); } int main(void){ ios::sync_with_stdio(false); int q; while(cin>>n&&n){ cin>>q; for(int i=1;i<=n;i++){//记录出现的次数 cin>>arr[i]; if(i==1){ A[i]=1; continue; } if(arr[i]==arr[i-1]){ A[i]=A[i-1]+1; } else A[i]=1; } ST(); while(q--){ int a,b; cin>>a>>b; int temp=a; while(temp<=b&&arr[temp]==arr[temp-1])//当查找的位置正好是连续的中间时找到最大的 temp++; int cnt=RMQ(temp,b);//运用RMQ查找最大的 int ans=max(temp-a,cnt); cout<<ans<<endl; } } } |
Double click to view unformatted code.