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;
}
posted @ 2019-04-29 21:06  李白莘莘学子  阅读(193)  评论(0编辑  收藏  举报