就是板题。。
查询子矩阵中最大的元素。。。然后看看是不是四个角落的 是就是yes 不是就是no 判断一下就好了
#include <iostream>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <map>
#include <set>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
#define rap(i, a, n) for(int i=a; i<=n; i++)
#define rep(i, a, n) for(int i=a; i<n; i++)
#define lap(i, a, n) for(int i=n; i>=a; i--)
#define lep(i, a, n) for(int i=n; i>a; i--)
#define MOD 2018
#define LL long long
#define ULL unsigned long long
#define Pair pair<int, int>
#define mem(a, b) memset(a, b, sizeof(a))
#define _ ios_base::sync_with_stdio(0),cin.tie(0)
//freopen("1.txt", "r", stdin);
using namespace std;
const int maxn = , INF = 0x7fffffff;
int n, m;
int dp[maxn][maxn][][], a[maxn][maxn];int rmq(int x1, int y1, int x2, int y2)
{ int kx = , ky = ;
while (( << ( + kx)) <= x2 - x1 + ) kx++;
while (( << ( + ky)) <= y2 - y1 + ) ky++;
int m1 = dp[x1][y1][kx][ky];
int m2 = dp[x2 - ( << kx) + ][y1][kx][ky];
int m3 = dp[x1][y2 - ( << ky) + ][kx][ky];
int m4 = dp[x2 - ( << kx) + ][y2 - ( << ky) + ][kx][ky]; return max(max(m1, m2), max(m3, m4));}int main()
{
while(cin>> n >> m)
{
rap(i, , n)
rap(j, , m)
{
scanf("%d", &a[i][j]);
dp[i][j][][] = a[i][j];
}
for (int i = ; ( << i) <= n; i++) {
for (int j = ; ( << j) <= m; j++) {
if (i == && j == ) continue;
for (int row = ; row + ( << i) - <= n; row++)
for (int col = ; col + ( << j) - <= m; col++) {
//当x或y等于0的时候,就相当于一维的RMQ了
//if(i == 0) dp[row][col][i][j] = max(dp[row][col][i][j - 1], dp[row][col + (1 << (j - 1))][i][j - 1]);
if (j == ) dp[row][col][i][j] = max(dp[row][col][i - ][j], dp[row + ( << (i - ))][col][i - ][j]);
else dp[row][col][i][j] = max(dp[row][col][i][j - ], dp[row][col + ( << (j - ))][i][j - ]);
}
}
}
int q;
scanf("%d", &q);
while(q--)
{
int x1, y1, x2, y2;
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
int h = rmq(x1, y1, x2, y2);
int flag = ;
if(a[x1][y1] == h || a[x2][y2] == h || a[x1][y2] == h || a[x2][y1] == h)
flag = ;
printf("%d %s\n", h, flag?"yes":"no");
}
} return ;
}