题意:
T组测试数据,每组测试数据有n个数组元素,接下来q次询问,求 [ l , r ] 内的最大值
解析:
RMQ模板题
代码:
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
#define pb push_back
#define mp make_pair
#define fi first
#define se second
typedef long long ll;
typedef pair<int,int> pii;
typedef double db;
const ll mod=1000000007;
const int maxn=1e5+10;
const int inf=0x3f3f3f3f;
const double eps=1e-6;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
int t,n,m,l,r,q,x,y;
int maxs[maxn][30],a[maxn];
void RMQ(){
for(int i=1;i<=n;i++){
maxs[i][0] = a[i];
}
for(int j=1;(1<<j)<=n;j++){
for(int i=1;i+(1<<j)-1 <= n;i++){
maxs[i][j] = max(maxs[i][j-1],maxs[i+(1<<(j-1))][j-1]);
}
}
}
int query(int l,int r){
int k=log(r-l+1)/log(2.0);
return max(maxs[l][k],maxs[r-(1<<k)+1][k]);
}
int main(){
cin>>t;
while(t--){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
RMQ();
scanf("%d",&m);
while(m--){
scanf("%d %d",&x,&y);
printf("%d\n",query(x,y));
}
}
return 0;
}