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

时间:2023-03-09 06:21:37
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;
}