数列区间最大值
输入一串数字,给你 M 个询问,每次询问就给你两个数字 X,Y,要求你说出 X 到 Y 这段区间内的最大数。
输入格式
第一行两个整数 N,M 表示数字的个数和要询问的次数;
接下来一行为 N 个数;
接下来 M 行,每行都有两个整数 X,Y。
输出格式
输出共 M 行,每行输出一个数。
数据范围
1≤N≤1e5,
1≤M≤1e6,
1≤X≤Y≤N,
数列中的数字均不超过2^31−1
输入样例:
10 2
3 2 4 5 6 8 1 2 9 7
1 4
3 8
输出样例:
5
8
#include<bits/stdc++.h>
using namespace std;
#define lint long long
int n,m;
int a[100010];
struct Tree{
int l,r,maxv;
}tree[400010];
void build(int i,int l,int r){ //构造线段树
int mid=(l+r)/2;
tree[i].l=l;
tree[i].r=r;
if(l==r) {tree[i].maxv=a[l]; return ;}
build(i*2,l,mid);
build(i*2+1,mid+1,r);
tree[i].maxv=max(tree[i*2].maxv,tree[i*2+1].maxv);
}
int find(int i,int l,int r){ //查找
if(tree[i].l>=l && tree[i].r<=r) return tree[i].maxv;
int maxv=INT_MIN,mid=(l+r)/2;
if(l>tree[i*2].r) maxv=find(i*2+1,l,r);
if(r<tree[i*2+1].l) maxv=find(i*2,l,r);
if(l<=tree[i*2].r && r>=tree[i*2+1].l) maxv=max(find(i*2,l,tree[i*2].r),find(i*2+1,tree[i*2+1].l,r));
return maxv;
}
int main(){
cin >> n >> m;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
build(1,1,n);
for(int i=1;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",find(1,x,y));
}
return 0;
}