#include<stdio.h>
#define MAX 100000+16
#define max(x,y) ((x>y)?(x):(y))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int t[MAX<<2],right[MAX],left[MAX],sym[MAX],ii;
void build(int l,int r,int rt)
{
int m;
if(l==r)
{
t[rt]=right[l]-left[l]+1;
return ;
}
m=(l+r)>>1;
build(lson);
build(rson);
t[rt]=max(t[rt<<1],t[rt<<1|1]);
}
int query(int a,int b,int l,int r,int rt)
{
int m,res1,res2;
if(a<=l&&r<=b)
return t[rt];
if(a>r||b<l)
return 0;
m=(l+r)>>1;
res1=query(a,b,lson);
res2=query(a,b,rson);
return max(res1,res2);
}
int n,q;
int main()
{
int val,cnt,i,x,a,b,la,rb;
while(~scanf("%d",&n)&&n)
{
scanf("%d",&q);
val=-MAX;cnt=0;
for(i=1;i<=n;i++)
{
scanf("%d",&x);
if(x!=val)
{
val=x;
cnt++;
left[cnt]=right[cnt]=i;
}
else
right[cnt]++;
sym[i]=cnt;
}
build(1,cnt,1);
while(q--)
{
scanf("%d%d",&a,&b);
la=sym[a];rb=sym[b];
if(la==rb)
printf("%d\n",b-a+1);
else
if(la+1==rb)
printf("%d\n",max(right[la]-a+1,b-left[rb]+1));
else
printf("%d\n",max(max(right[la]-a+1,b-left[rb]+1),query(la+1,rb-1,1,cnt,1)));
}
}
}
poj 3368 线段树(转换)
最新推荐文章于 2020-04-04 20:13:18 发布