#include <cstdio>
#include <cmath>
#include <cstring>
#include <iostream>
using namespace std;
const int NN=301;
int n,m,a[NN][NN],dp[NN][NN][9][9]; //內存卡得緊
inline void get(int &x)
{
char c=getchar();
while (c<'0' || c>'9') c=getchar();
x=c-'0';
c=getchar();
while (c>='0' && c<='9') x=x*10+c-'0',c=getchar();
}
void RMQ_init()
{
for (int i=1; i<=n; i++)
for (int j=1; j<=m; j++) dp[i][j][0][0]=a[i][j];
int lim1=log(n)/log(2);
int lim2=log(m)/log(2);
for (int k1=0; k1<=lim1; k1++)
for (int k2=0; k2<=lim2; k2++) if (k1+k2)
for (int i=1; i<=n-(1<<k1)+1; i++)
for (int j=1; j<=m-(1<<k2)+1; j++)
{
if (k2)
dp[i][j][k1][k2]=max(dp[i][j][k1][k2-1],dp[i][j+(1<<(k2-1))][k1][k2-1]);
else
dp[i][j][k1][k2]=max(dp[i][j][k1-1][k2],dp[i+(1<<(k1-1))][j][k1-1][k2]);
}
}
int RMQ(int x1,int y1,int x2,int y2)
{
int k1=log(x2-x1+1)/log(2);
int k2=log(y2-y1+1)/log(2);
int s1=max(dp[x1][y1][k1][k2],dp[x2-(1<<k1)+1][y2-(1<<k2)+1][k1][k2]);
int s2=max(dp[x1][y2-(1<<k2)+1][k1][k2],dp[x2-(1<<k1)+1][y1][k1][k2]);
return max(s1,s2);
}
int main()
{
int q,w,x1,y1,x2,y2;
while (scanf("%d%d",&n,&m)==2)
{
for (int i=1; i<=n; i++)
for (int j=1; j<=m; j++) get(a[i][j]);
RMQ_init();
scanf("%d",&q);
while (q--)
{
get(x1); get(y1);
get(x2); get(y2);
w=RMQ(x1,y1,x2,y2);
printf("%d ",w);
if (a[x1][y1]==w || a[x2][y1]==w || a[x1][y2]==w || a[x2][y2]==w)
printf("yes\n");
else
printf("no\n");
}
}
return 0;
}
HDOJ2888-裸二維RMQ
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.