The Water Problem
Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 302 Accepted Submission(s): 245
Problem Description
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,...,an
representing the size of the water source. Given a set of queries each containing
2
integers
l
and
r
, please find out the biggest water source between
al
and
ar
.
Input
First you are given an integer
T(T≤10)
indicating the number of test cases. For each test case, there is a number
n(0≤n≤1000)
on a line representing the number of water sources.
n
integers follow, respectively
a1,a2,a3,...,an
, and each integer is in
{1,...,106}
. On the next line, there is a number
q(0≤q≤1000)
representing the number of queries. After that, there will be
q
lines with two integers
l
and
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 很明显的区间最大值 ac代码:#include<stdio.h> struct s { int left; int right; int max; }tree[1000*4]; int MAX(int a,int b) { return a>b?a:b; } void build(int i,int l,int r) { tree[i].left=l; tree[i].right=r; if(l==r) { int num; scanf("%d",&num); tree[i].max=num; return; } int mid=(l+r)/2; build(i*2,l,mid); build(i*2+1,mid+1,r); tree[i].max=MAX(tree[i*2].max,tree[i*2+1].max); } int query(int l,int r,int i) { if(l<=tree[i].left&&r>=tree[i].right) { return tree[i].max; } int mid=(tree[i].left+tree[i].right)/2; if(r<=mid) return query(l,r,i*2); if(l>mid) return query(l,r,i*2+1); return MAX(query(l,mid,i*2),query(mid+1,r,i*2+1)); } int main() { int t; int a,b,i,n,m; scanf("%d",&t); while(t--) { scanf("%d",&n); build(1,1,n); scanf("%d",&m); for(i=0;i<m;i++) { scanf("%d%d",&a,&b); printf("%d\n",query(a,b,1)); } } return 0; }