tj
2026-01-25 11:30:00
发布于:北京
2阅读
0回复
0点赞
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
#define int long long
struct TreeNode{
int L,R;
int mx;
};
TreeNode tr[N << 2];
int n,m;
int a[N];
void build(int k,int L,int R){
//告诉 k 结点,区间是 [L,R]
tr[k].L = L,tr[k].R = R;
if(L == R){ //到叶子,不进行递归,显然最值是它自己
tr[k].mx = a[L];
} else{
int mid = (L + R) / 2;
int lc = 2 * k;
int rc = lc + 1;
build(lc,L,mid);
build(rc,mid + 1,R);
tr[k].mx = max(tr[lc].mx,tr[rc].mx);
}
}
int query_max(int k,int L,int R){
if(tr[k].L >= L && tr[k].R <= R){
return tr[k].mx;
}else{
//考虑左右贡献
int mid = (tr[k].L + tr[k].R) / 2;
int lc = 2 * k;
int rc = lc + 1;
int lret = -1e18;
int rret = -1e18;
if(L <= mid){
lret = query_max(lc,L,R); // 左贡献
}
if(R > mid){
rret = query_max(rc,L,R); // 右贡献
}
return max(lret,rret); // 返回最值
}
}
signed main(){
cin >> n >> m;
for(int i = 1;i <= n;i++){
cin >> a[i];
}
build(1,1,n);
for(int i = 1;i <= m;i++){
int x,y;
cin >> x >> y;
cout << query_max(1,x,y) << "\n";
}
return 0;
}
这里空空如也






有帮助,赞一个