In Land waterless, water is a very limited resource. People always fight for the biggest source of water. Given a sequence of water sources with a1,a2,a3,...,ana1,a2,a3,...,anrepresenting the size of the water source. Given a set of queries each containing 22integers ll and rr, please find out the biggest water source between alal and arar.
Input
First you are given an integer T(T≤10)T(T≤10) indicating the number of test cases. For each test case, there is a number n(0≤n≤1000)n(0≤n≤1000) on a line representing the number of water sources. nn integers follow, respectively a1,a2,a3,...,ana1,a2,a3,...,an, and each integer is in {1,...,106}{1,...,106}. On the next line, there is a number q(0≤q≤1000)q(0≤q≤1000) representing the number of queries. After that, there will be qq lines with two integers ll and r(1≤l≤r≤n)r(1≤l≤r≤n) indicating the range of which you should find out the biggest water source.
Output
For each query, output an integer representing the size of the biggest water source.
Sample Input
3 1 100 1 1 1 5 1 2 3 4 5 5 1 2 1 3 2 4 3 4 3 5 3 1 999999 1 4 1 1 1 2 2 3 3 3
Sample Output
100 2 3 4 4 5 1 999999 999999 1
题意:
给定一个一组数,求区间最大值。(裸的线段树)
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1000+5;
#define lson i*2,l,m
#define rson i*2+1,m+1,r
#define INF 1e9
int maxv[maxn*4];
void PushUP(int i)
{
maxv[i]=max(maxv[i*2],maxv[i*2+1]);
}
void build(int i,int l,int r)
{
if(l==r)
{
scanf("%d",&maxv[i]);
return;
}
int m=(l+r)/2;
build(lson);
build(rson);
PushUP(i);
}
int query(int ql,int qr,int i,int l,int r)
{
if(ql<=l&&qr>=r) return maxv[i];
int m=(l+r)/2;
int ans=-INF;
if(ql<=m) ans=max(ans,query(ql,qr,lson));
if(m<qr) ans=max(ans,query(ql,qr,rson));
return ans;
}
void update(int id,int val,int i,int l,int r)
{
if(l==r)
{
maxv[i]=val;
return;
}
int m=(r+l)/2;
if(id<=m) update(id,val,lson);
else update(id,val,rson);
PushUP(i);
}
int main()
{
int n,t,T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
build(1,1,n);
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",query(a,b,1,1,n));
}
}
return 0;
}