#include <iostream>
#include <cstdio>
using namespace std;
const int maxn=200001;
#define left l,m,rt<<1
#define right m+1,r,rt<<1|1
int Max[maxn<<2];
void UP(int rt)
{
Max[rt]=max(Max[rt<<1],Max[rt<<1|1]);
}
void build(int l,int r,int rt)
{
if(l==r)
{
scanf("%d",&Max[rt]);
return;
}
int m=(l+r)>>1;
build(left);
build(right);
UP(rt);
}
int query(int L,int R,int l,int r,int rt)
{
if(L<=l&&R>=r)return Max[rt];
int m=(r+l)>>1;
int ret=0;
if(L<=m)ret=max(ret,query(L,R,left));
if(R>m)ret=max(ret,query(L,R,right));
return ret;
}
int x[maxn];
int main()
{
int N,M,i,j,sum,T,q,le,ri;
char character;
int a,b;
scanf("%d",&T);
while(T--)
{
scanf("%d",&N);
sum=0;
build(1,N,1);
scanf("%d",&q);
while(q--)
{
scanf("%d%d",&le,&ri);
int sum=query(le,ri,1,N,1);
cout<<sum<<endl;
}
}
return 0;
}
杭电5443 线段树模板
最新推荐文章于 2018-12-13 10:50:36 发布