#include <bits/stdc++.h>
using namespace std;
const int N = 300;
int n, m, Q;
int f[N][N][30][30];
int read(void)
{
int s = 0, w = 0; char c = getchar();
while (c < '0' || c > '9') w |= c == '-', c = getchar();
while (c >= '0' && c <= '9') s = s*10+c-48, c = getchar();
return w ? -s : s;
}
void work(void)
{
int x1 = read(), y1 = read();
int x2 = read(), y2 = read();
int k1 = log2(x2 - x1 + 1);
int k2 = log2(y2 - y1 + 1);
int res1 = max(f[x1][y1][k1][k2],f[x2-(1<<k1)+1][y1][k1][k2]);
int res2 = max(f[x1][y2-(1<<k2)+1][k1][k2],f[x2-(1<<k1)+1][y2-(1<<k2)+1][k1][k2]);
printf("%d\n", max(res1,res2));
return;
}
int main(void)
{
n = read(), m = read(), Q = read();
for (int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
f[i][j][0][0] = read();
int L1 = log2(n);
int L2 = log2(m);
for (int t=1;t<=L1;++t)
for (int i=1;i<=n-(1<<t)+1;++i)
for (int j=1;j<=m;++j)
f[i][j][t][0] = max(f[i][j][t-1][0],f[i+(1<<t-1)][j][t-1][0]);
for (int t=1;t<=L2;++t)
for (int i=1;i<=n;++i)
for (int j=1;j<=m-(1<<t)+1;++j)
f[i][j][0][t] = max(f[i][j][0][t-1],f[i][j+(1<<t-1)][0][t-1]);
for (int t1=1;t1<=L1;++t1)
for (int t2=1;t2<=L2;++t2)
for (int i=1;i<=n-(1<<t1)+1;++i)
for (int j=1;j<=m-(1<<t2)+1;++j)
{
f[i][j][t1][t2] = max(f[i][j][t1-1][t2],f[i+(1<<t1-1)][j][t1-1][t2]);
f[i][j][t1][t2] = max(f[i][j][t1][t2-1],f[i][j+(1<<t2-1)][t1][t2-1]);
}
while (Q --) work();
return 0;
}
二维ST模板
最新推荐文章于 2021-08-15 12:03:10 发布