hdoj 5443 The Water Problem【线段树求区间最大值】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5443

刷道水题助助兴

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stack>
#define MAX 2100
#define INF 0x7fffff
using namespace std;
int n,m;
int Max[MAX];
void pushup(int o)
{
	Max[o]=max(Max[o<<1],Max[o<<1|1]);
}
void gettree(int o,int l,int r)
{
	if(l==r)
	{
		scanf("%d",&Max[o]);
		return ;
	}
	int mid=(l+r)>>1;
	gettree(o<<1,l,mid);
	gettree(o<<1|1,mid+1,r);
	pushup(o);
}
int find(int o,int l,int r,int L,int R)
{
	if(L<=l&&R>=r)
	{
		return Max[o];
	}
	int ans=0;
	int mid=(l+r)>>1;
	if(R<=mid)
	    ans=max(ans,find(o<<1,l,mid,L,R));
	else if(L>mid)
	    ans=max(ans,find(o<<1|1,mid+1,r,L,R));
	else 
	{
		ans=max(ans,find(o<<1,l,mid,L,R));
		ans=max(ans,find(o<<1|1,mid+1,r,L,R));
	}
	return ans;
}
int main()
{
    int t,i,j,a,b;
    scanf("%d",&t);
    while(t--)
    {
    	scanf("%d",&n);
    	gettree(1,1,n);
    	scanf("%d",&m);
    	while(m--)
    	{
    		scanf("%d%d",&a,&b);
    		printf("%d\n",find(1,1,n,a,b));
    	}
    }
	return 0;
}

  

posted @ 2015-09-21 22:20  非我非非我  阅读(121)  评论(0编辑  收藏  举报