/**
* Two Dimensional DMQ, Time Complexity O(n*m*logn*logm)
* the index of array begins at 1
*/
int val[310][310]; // store values
int dp[310][310][9][9]; // store maxium value
// dp[i][j][k][l] represents for in the diagonal x-axis(i,i+2**k-1)
// y-axis(j,j+2**l-1), the maxium value is dp[][][][]
int mm[310]; //二进制位数减去1,使用前需要初始化
void initRMQ(int n, int m) { // n rows, m colums
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
dp[i][j][0][0] = val[i][i];
}
}
mm[0] = -1;
for (int i = 1; i <= max(n, m); i++) {
mm[i] = ((i & (i - 1)) == 0 ? mm[i - 1] + 1 : mm[i - 1]);
}
for (int ii = 0; ii <= mm[n]; ii++) {
for (int jj = 0; jj <= mm[m]; jj++) {
if (ii + jj) {
for (int i = 1; i + (1 << ii) - 1 <= n; i++) {
for (int j = 1; j + (1 << jj) - 1 <= m; j++) {
if (ii) {
dp[i][j][ii][jj] = max(dp[i][j][ii - 1][jj],
dp[i + 1 << (ii - 1)][j][ii - 1][jj]);
} else {
dp[i][j][ii][jj] =
max(dp[i][j][ii][jj - 1], dp[i][j + (1 << (jj−1))][ii][jj−1]);
}
}
}
}
}
}
// query the maxium value in matrix
}
// query the maxium value in matrix
int rmq(int x1, int y1, int x2, int y2) {
int k1 = mm[x2 - x1 + 1]; // neareste integer of log(x2-x1+1)
int k2 = mm[y2 - y1 + 1];
x2 = x2 - (1 << k1) + 1;
y2 = y2 - (1 << k2) + 1;
return max(max(dp[x1][y1][k1][k2], dp[x1][y2][k1][k2]),
max(dp[x2][y1][k1][k2], dp[x2][y2][k1][k2]));
}
/** * Two Dimensional DMQ, Time Complexity O(n*m*logn*logm) * the index of array begins at 1 */int val[310][310]; // store valuesint dp[310][310][9][9]; // store maxium value// dp[i][j][k]...