#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1e6 + 10;
int st[maxn][21]; //st[i][j]表示从第i位计数,共2的j次方的数的最大值
//比如st[1][2]表示1,2,3,4这四个数的最大值 (四就是二的平方)
//比如st[2][2]表示2,3,4,5这四个数的最大值 (四就是二的平方)
void init_st(int n) {
for (int j = 1; j <= 20; j++) {
for (int i = 1; i + (1 << j) - 1 <= n; i++) {
//注意边界,比如如上的第一个栗子
//left是(1),right是(1 + 2的平方 - 1)right不能越界
st[i][j] = max(st[i][j - 1], st[i + (1 << (j - 1))][j - 1]);
}
}
}
int Query(int l, int r) {
int k = (int)log2(r - l + 1);
int a = st[l][k];
int b = st[r - (1 << k) + 1][k];
return max(a, b);
}
int main() {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> st[i][0];
}
init_st(n);
while (m--) {
int l, r;
cin >> l >> r;
printf("%d\n", Query(l, r));
}
return 0;
}
模板——ST表之最大值问题
猜你喜欢
转载自blog.csdn.net/qq_45739057/article/details/105439184
今日推荐
周排行