The Water Problem
Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 1903 Accepted Submission(s): 1508
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
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1000 + 10;
int maxn[N][30];
int a[N];
int num,q;
void RMQ()
{
for(int i = 1; i <= num; i++)
maxn[i][0] = a[i];
for(int j = 1; (1 << j) <= num; j++)
for(int i = 1; (i + (1 << j) - 1) <= num; i++){
maxn[i][j] = max(maxn[i][j-1],maxn[i+(1<<(j-1))][j-1]);
}
}
int Query(int L, int R){
int k = 0;
while((1 << (k + 1)) <= R - L + 1)
k++;
return max(maxn[L][k],maxn[R - (1 << k) + 1][k]);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&num);
for(int i = 1; i <= num; i++)
scanf("%d",&a[i]);
RMQ();
int l,r;
scanf("%d",&q);
while(q--)
{
scanf("%d%d",&l,&r);
printf("%d\n",Query(l,r));
}
}
return 0;
}
转载请注明原文地址: https://ju.6miu.com/read-16863.html