ST表

    int a[100010];
    int st1[100010][25];//st表
    int st2[100010][25];//st表
    void init(int n){
        for (int i = 0; i < n; i++){
            st1[i][0] = a[i + 1];
            st2[i][0] = a[i + 1];
        }
        for (int i = 1; (1 << i) <= n; i++){
            for (int j = 0; j + (1 << i) - 1 < n; j++){
                st1[j][i] = max(st1[j][i - 1], st1[j + (1 << (i - 1))][i - 1]);
                st2[j][i] = min(st2[j][i - 1], st2[j + (1 << (i - 1))][i - 1]);
            }
        }
    }
    int querysmax(int l, int r){
        l--;
        r--;
        int k = (int)(log((double)(r - l + 1)) / log(2.0));
        return max(st1[l][k], st1[r - (1 << k) + 1][k]);
    }
    int queryemin(int l, int r){
        l--;
        r--;
        int k = (int)(log((double)(r - l + 1)) / log(2.0));
        return min(st2[l][k], st2[r - (1 << k) + 1][k]);
    }
rush!
原文地址:https://www.cnblogs.com/LH2000/p/15750888.html