#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cmath>
using namespace std ;
const int N = 300 + 11 ;
int dp[N][N][9][9] ;
int n , m ;
void init() {
for(int i = 1 ; i <= n ; ++i) {
for(int j = 1 ; j <= m ;++j) {
scanf("%d" ,&dp[i][j][0][0]) ;
}
}
int m1 , m2 , m3 , m4 ;
for(int r = 0 ; (1<<r) <= n ; ++r) {
for(int c = 0 ; (1<<c) <= m ; ++c) {
if(r == 0 && c == 0) continue ;
for(int i = 1 ; i+(1<<r)-1 <= n ; ++i) {
for(int j = 1 ; j+(1<<c)-1 <= m ; ++j) {
if(r) {
dp[i][j][r][c] = max(dp[i][j][r-1][c] , dp[i+(1<<(r-1))][j][r-1][c]) ;
}else {
dp[i][j][r][c] = max(dp[i][j][r][c-1] , dp[i][j+(1<<(c-1))][r][c-1]) ;//先算當r爲0的時候
}
}
}
}
}
}
void query(int x1 , int y1 , int x2 , int y2) {
int kx = (int)(log(x2 - x1 + 1.0)/log(2.0)) ;
int ky = (int)(log(y2 - y1 + 1.0)/log(2.0)) ;//log2居然CE
int m1 = dp[x1][y1][kx][ky] ;
int m2 = dp[x2-(1<<kx)+1][y1][kx][ky] ;
int m3 = dp[x1][y2-(1<<ky)+1][kx][ky] ;
int m4 = dp[x2-(1<<kx)+1][y2-(1<<ky)+1][kx][ky] ;
int tmp = max(m1 , max(m2 , max(m3 , m4))) ;//分爲4個部分
printf("%d ", tmp) ;//以上爲二維RMQ模板
if(dp[x1][y1][0][0] == tmp || dp[x1][y2][0][0] == tmp || dp[x2][y1][0][0] == tmp || dp[x2][y2][0][0] == tmp) {
printf("yes\n") ;
}else {
printf("no\n") ;
}
}
int main() {
int a , b , c , d , q ;
while(scanf("%d%d" ,&n ,&m)==2) {
init() ;
scanf("%d" , &q) ;
while(q--) {
scanf("%d%d%d%d" ,&a ,&b ,&c ,&d) ;
query(a , b , c , d ) ;
}
}
}
HDU 2888 二維RMQ 模板
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.