st表求调,玄关
查看原帖
st表求调,玄关
1020005
c20220525楼主2024/1/6 17:57

rt

#include <bits/stdc++.h>
#define int long long
#define rg register
#define N 100005
using namespace std;
int n,m,a[N],p[N],t[N],cnt,f[N][21];
inline int query(int l, int r){
	int L=t[p[l]]-l+1,R=r-t[p[r]-1],ll=p[l],rr=p[r];
	if(ll==rr) return rr-ll+1;
	else if(rr-ll==1) return max(L,R);
	int k=log2(rr-ll-1);
	return max(max(max(f[ll+1][k],f[rr-(1<<k)][k]),L),R);
}
signed main(){
	while(scanf("%lld",&n),n!=0){
		scanf("%lld",&m);
		cnt=0;
		memset(a,0,sizeof(a));
		memset(t,0,sizeof(t));
		memset(p,0,sizeof(p));
		memset(f,0,sizeof(f));
		for(rg int i = 1; i <= n; i++ ){
			scanf("%lld",a+i);
			if(a[i]!=a[i-1]){
				t[cnt++]=i-1;
			}
			p[i]=cnt;
			f[cnt][0]++;
		}
		t[cnt]=n;
		for(rg int j = 1; (1<<j) <= cnt; j++ ){
			for(rg int i = 1; (i+(1<<j)-1)<= cnt; i++ ){
				f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
			}
		}
		while(m--){
			int l,r;
			scanf("%lld%lld",&l,&r);
			printf("%lld\n",query(l,r));
		}
	}
	return 0;
}
2024/1/6 17:57
加载中...