51nod1174 區間中最大的數
阿新 • • 發佈:2018-11-01
/*
1,線段樹查詢區間最值
2,RMQ
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int maxn=1e4+5;
int n,q;
int s[maxn];
int a,b;
int ans;
struct node
{
int left,right,maxs;
}tree[maxn<<2];
void build(int i,int L,int R)
{
tree[i].left=L;
tree[i].right=R;
if (L==R)
{
tree[i].maxs=s[L];
return ;
}
int mid=(tree[i].left+tree[i].right)>>1;
build(i<<1,L,mid);
build(i<<1|1,mid+1,R);
tree[i].maxs=max(tree[i<<1].maxs,tree[i<<1|1].maxs);
}
void query(int i,int L,int R,int ql,int qr)
{
if(ql<=L&&R<=qr)
{
ans=max(ans,tree[i].maxs);
return ;
}
int mid=(tree[i].left+tree[i].right)>>1;
if(qr<=mid) query(i<<1,L,mid,ql,qr);
else if(ql>mid) query(i<<1|1,mid+1,R,ql,qr);
else
{
query(i<<1,L,mid,ql,qr);
query(i<<1|1,mid+1,R,ql,qr);
}
}
int main()
{
while(~scanf ("%d",&n))
{
for(int i=1;i<=n;i++)
{
scanf("%d",&s[i]);
}
build(1,1,n);
scanf("%d",&q);
for(int i=0;i<q;i++)
{
scanf("%d%d",&a,&b);
ans=-1;
query(1,1,n,a+1,b+1);
printf("%d\n",ans);
}
}
return 0;
}