POJ 3264 Balanced Lineup 成段更新

水题一枚...

#include<cstdio>
#include<cstring>
#define left l,m,x<<1
#define right m+1,r,x<<1|1
#define eps 1e8
const int LMT=50002;
int hei[LMT<<2],sho[LMT<<2],__hei,__sho;
inline int max(int a,int b)
{
	return a>b?a:b;
}
inline int min(int a,int b)
{
	return a<b?a:b;
}
void init(void)
{
	int i;
	for(i=0;i<LMT<<2;i++)
	{
		hei[i]=0;
		sho[i]=(int)eps;
	}
}
void update(int op,int pos,int l,int r,int x)
{
	if(l==r)
	{
		hei[x]=sho[x]=op;
		return;
	}
	int m=(l+r)>>1;
	if(pos<=m)
	{
		update(op,pos,left);
		hei[x]=max(hei[x],hei[x<<1]);
		sho[x]=min(sho[x],sho[x<<1]);
	}
	if(pos>m)
	{
		update(op,pos,right);
		hei[x]=max(hei[x],hei[x<<1|1]);
		sho[x]=min(sho[x],sho[x<<1|1]);
	}
}
void equery(int L,int R,int l,int r,int x)
{
	if(L<=l&&r<=R)
	{
		__hei=max(__hei,hei[x]);
		__sho=min(__sho,sho[x]);
		return;
	}
	int m=(l+r)>>1;
	if(L<=m)equery(L,R,left);
	if(R>m)equery(L,R,right);
}
int main(void)
{
	int i,n,h,q,l,r;
	while(~scanf("%d%d",&n,&q))
	{
		init();
		for(i=1;i<=n;i++)
		{
			scanf("%d",&h);
			update(h,i,1,n,1);
		}
		while(q--)
		{
			__hei=0;__sho=(int)eps;
			scanf("%d%d",&l,&r);
			equery(l,r,1,n,1);
			printf("%d\n",__hei-__sho);
		}

	}
	return 0;
}


你可能感兴趣的:(POJ 3264 Balanced Lineup 成段更新)