The Water Problem


Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 606    Accepted Submission(s): 489



Problem Description


a1,a2,a3,...,anrepresenting 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


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)


 



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 <iostream>
#include <stdio.h>
#include <string.h>
#include <cmath>
#include <algorithm>
#include <map>
#include <queue>
using namespace std;
const int maxn=1000+10;
const int inf=0xffffff0;
int Max=-inf;
struct Node
{
    int l,r;
    int num;
    int mid()
    {
        return (l+r)/2;
    }
};
Node tree[800010];
void Buildtree(int root,int l,int r)
{
    tree[root].l=l;
    tree[root].r=r;
    tree[root].num=-inf;

    if(l!=r)
    {
        Buildtree(root*2+1,l,(l+r)/2);
        Buildtree(root*2+2,(l+r)/2+1,r);
    }
}
void Add(int root,int i,int val)
{
    if(tree[root].l==tree[root].r)
    {
        tree[root].num=val;
        return;
    }
    tree[root].num = max(tree[root].num,val);
    if(i<=tree[root].mid())
    {
        Add(2*root+1,i,val);
    }
    else
    {
        Add(2*root+2,i,val);
    }
}
void query(int root,int l,int r)
{
    if(tree[root].num<=Max )
        return;
    if(tree[root].l==l&&tree[root].r==r)
    {
        Max=max(Max,tree[root].num);
        return;
    }
    if(r<=tree[root].mid())
        query(2*root+1,l,r);
    else if(l>tree[root].mid())
        query(2*root+2,l,r);
    else
    {
        query(2*root+1,l,tree[root].mid());
        query(2*root+2,tree[root].mid()+1,r);
    }
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,a;
        scanf("%d",&n);
        Buildtree(0,1,n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a);
            Add(0,i,a);
        }
        int p;
        scanf("%d",&p);
        for(int i=0;i<p;i++)
        {
            int l,r;
            scanf("%d%d",&l,&r);
            Max=-inf;
            query(0,l,r);
            printf("%d\n",Max);
        }
    }
    return 0;
}