poj 3368 线段树(转换)

来源:互联网 发布:swatch黑白时分淘宝 编辑:程序博客网 时间:2024/06/06 07:17
#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|1int 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;}elseright[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)));         }}}

0 0
原创粉丝点击