5443
区域最值,线段树解题
#include<bits/stdc++.h>
#define max 0x3f3f3f3f
using namespace std;
int MAXNUM;
int a[1500];
struct Tree{
int Max;
int r,l;
}t[6000];
int MAX(int k,int j){
if(k>=j)
return k;
return j;
}
void build(int idx,int l,int r){
t[idx].l=l;
t[idx].r=r;
if(l==r){
t[idx].Max=a[l];
return;
}
int mid=(l+r)>>1;
build(idx<<1,l,mid);
build(idx<<1|1,mid+1,r);
t[idx].Max = MAX(t[idx<<1].Max,t[idx<<1|1].Max); //父亲节点
}
void query(int idx,int l,int r,int L,int R){
if(l>=L&&r<=R){
MAXNUM=MAX(MAXNUM,t[idx].Max);
return;
}
int mid=(l+r)>>1;
if(mid>=L)
query(idx<<1,l,mid,L,R);
if(mid<R)
query(idx<<1|1,mid+1,r,L,R);
}
int main(){
int tcase;
scanf("%d",&tcase);
while(tcase--){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
build(1,1,n);
int m;
scanf("%d",&m);
for(int i=1;i<=m;i++){
int l,r;
scanf("%d%d",&l,&r);
MAXNUM=-max;
query(1,1,n,l,r);
printf("%d\n",MAXNUM);
}
}
}