下笔春蚕食叶声。

与众不同

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define debug printf("*");
//#define mo 1e9+7
const int N=2e5+5,M=2e5+5,change=1e6+5;
int n,m,l,r,a[N],last[change<<1],start[N],f[N],Log[N],mx[N][20];
int find(int L,int R){
	if(start[L]==L) return L;
	if(start[R]<L) return R+1;
	int ll=L;
	int mid,res=L;
	while(L<=R){
		mid=(L+R)>>1;
		if(start[mid]<ll) L=mid+1;
		else R=mid-1,res=mid;
	}
	return res;
}
int query(int L,int R){
	int s=Log[R-L+1];//cout<<L<<" "<<R<<" "<<s<<" "<<endl; 
	return max(mx[L][s],mx[R-(1<<s)+1][s]); 
}
int main(){
	scanf("%d%d",&n,&m);
	Log[1]=0;
	for(int i=2;i<=n;i++) Log[i]=Log[i>>1]+1; 
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		start[i]=max(start[i-1],last[a[i]+change]+1);
		last[a[i]+change]=i;
		f[i]=i-start[i]+1;
		mx[i][0]=f[i];
//		cout<<i<<"*"<<start[i]<<endl;
	}
	for(int j=1;j<=18;j++)
		for(int i=1;i+(1<<j)-1<=n;i++)
			mx[i][j]=max(mx[i][j-1],mx[i+(1<<(j-1))][j-1]);
	for(int i=1;i<=m;i++){
		scanf("%d%d",&l,&r);
		l++,r++;
		int tmp=find(l,r);//cout<<tmp<<endl;
		int ans=tmp-l;
		if(tmp<=r) ans=max(ans,query(tmp,r));
		printf("%d\n",ans);
	}
	return 0;
}
/*
https://www.cnbLogs.com/zzctommy/p/12342078.html
*/ 
posted @ 2020-02-22 15:24  ACwisher  阅读(124)  评论(0编辑  收藏  举报