ST表
#include <iostream>
#include <algorithm>
using namespace std;
int a[1010];//原始输入数组
int st[1010][20];//st表
void init(int n)//初始化st表
{
for (int i = 0; i < n; i++)
st[i][0] = a[i];
for (int j = 1; (1 << j) <= n; j++)//由前推后先枚举j
{
for (int i = 0; i + (1 << j) - 1 < n; i++)//i+(1<<j)-1为右边界
st[i][j] = min(st[i][j - 1], st[i + (1 << (j - 1))][j - 1]);//前一半和后一半的最小值
}
}
int search(int l, int r)
{
int k = (int)log2(r - l + 1);
return min(st[l][k], st[r - (1 << k) + 1][k]);
}
int main()
{
int n, m;
while (cin >> n >> m)
{
for (int i = 0; i < n; i++)
cin >> a[i];
init(n);
while (m--)
{
int l, r;
cin >> l >> r;
cout << search(l, r) << endl;
}
}
return 0;
}2.
#include<bits/stdc++.h>
using namespace std;
int n;
vector<int>a(n);
vector<vector<int>>st;
int query(int l, int r) {
int j = (int)log2(r - l + 1);
return max(st[l][j], st[r - (1 << j) + 1][j]);
}
int main()
{
cin >> n;
a.resize(n);
st.resize(n, vector<int>(log2(n) + 5));
for (int i = 0; i < n; i++) {
cin >> a[i];
st[i][0] = a[i];
}
for (int j = 1; (1 << j) <= n; j++) {
for (int i = 0; i + (1 << j) - 1 < n; i++) {
st[i][j] = max(st[i][j - 1], st[i + (1 << (j - 1))][j - 1]);
}
}
int l, r;
while (cin >> l >> r) {
cout << query(l, r) << endl;
}
}