问题
    数列中下标在l ~ r之间的数最大(小)值是多少

时间复杂度
    O( 1 )

状态表示
    f[i][j]表示从 i 开始的 2^j 个数的最大值

状态转移方程
    f[i][j] = max( f[i][j - 1], f[i + 2 ^ (j - 1)][j - 1] )

初值
    f[1 ~ n][0] = a[1 ~ n]

目标
    max / min
code
    void pre()
    {
        for( int i = 1; i <= n; i ++ )
            f[i][0] = a[i];

        int t = log2( n );
        for( int j = 1; j <= t; j ++ )                    
            for( int i = 1; i - 1 + ( 1 << j ) <= n; i ++ )
                f[i][j] = max( f[i][j - 1], f[i + ( 1 << j - 1 )][j - 1] );

    }

    int ask( int l, int r )
    {
        int k = log2( r - l + 1 );
        return max( f[l][k], f[r - ( 1 << k ) + 1][k] );
    }