非常优美的RMQ问题,可以运到桶的思想
#include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #include<cmath> #define MAXN 100000+10 #define LOG 20 #define pii pair<int,int> using namespace std; int a[MAXN]; int cnt[MAXN],left[MAXN],right[MAXN],tot; int n,T; int p[MAXN]; int d[MAXN][LOG]; void RMQ_init(){ for(int i=1;i<=tot;i++){ d[i][0]=cnt[i]; } for(int j=1;j<LOG;j++){ for(int i=1;i<=tot;i++){ if(i+(1<<j)-1>tot)break; d[i][j]=max(d[i][j-1],d[i+(1<<(j-1))][j-1]); } } } int RMQ(int x,int y){ int len=y-x+1; int k=(int)(log(len*1.0)/log(2)); k=max(k-2,0); while((1<<(k+1))<=len)k++; return max(d[x][k],d[y-(1<<k)+1][k]); } void solve(){ memset(cnt,0,sizeof(cnt)); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); if(a[i]!=a[i-1]){ right[tot]=i-1; tot++; left[tot]=i; } p[i]=tot; cnt[tot]++; } right[tot]=n; RMQ_init(); for(int i=1;i<=T;i++){ int L,R; scanf("%d%d",&L,&R); if(p[L]==p[R]){ printf("%d ",R-L+1); } else{ int ans=max(right[p[L]]-L+1,R-left[p[R]]+1); if(p[L]+1<=p[R]-1) ans=max(ans,RMQ(p[L]+1,p[R]-1)); printf("%d ",ans); } } } int main() { // freopen("data.in","r",stdin); while(1){ scanf("%d%d",&n,&T); if(!n)break; solve(); } return 0; }