st表

#include <iostream>
#include <algorithm>
using namespace std;
int a[1001];
int st[1010][20];//st表
void init(int n)//预处理
{
    for (int i = 0; i < n; i++)//底层元素设置
        st[i][0] = a[i];
    for (int i = 1; (1 << i) <= n; i++)//一层一层往上处理
    {
        for (int j = 0; j + (1 << i) - 1 < n; j++)
            st[j][i] = min(st[j][i - 1],st[j + (1 << (i - 1))][i - 1]);
    }
}
int search(int l, int r)//O(1)查找操作
{
    int k = (int)(log((double)(r - l + 1)) / log(2.0));
    return min(st[l][k],st[r - (1 << k) + 1][k]);
}
int main()
{
    int n,m;
 cin>>n>>m;
        for (int i = 0; i < n; i++)
            cin >> a[i];
        init(n);
  for(int j=1;j<=m;j++)
  {
            int l, r;
            cin >> l >> r;
            cout << search(l,r) << endl;;
        }
    return 0;
}
原文地址:https://www.cnblogs.com/lbssxz/p/10792885.html