1. 程式人生 > >51nod1174 區間中最大的數

51nod1174 區間中最大的數

/*
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; }