void get_rmp () {
    for (int i=1;i<=n;i++) r[i][0]=a[i];// a[] 原数组
    for (int j=1;(1<<j)<=n;j++)
        for (int i=1;i+(1<<j)-1<=n;i++)
            r[i][j]=min(r[i][j-1],r[i+(1<<(j-1))][j-1]);
    return ;
}
int query_rmp(int x,int y) {  // 区间 (x ,y)最下值
    if (x>y) swap(x,y);int k=0;
    while ( y-x+1>=(1<<(1+k)) ) k++;
    return min (r[x][k],r[y-(1<<k)+1][k]);
}

位运算真是好哈

r[i][j]// 以i开始长度为(2^j)的数组的最小值

递推关系 r[i][j]=r[i][j]=min(r[i][j-1],r[i+(1<<(j-1))][j-1]);