输入一行为正整数n和m,2<=n<=500,1<=m<=50000。
接着为n*n个整数代表宝石储量,均不超过1000000。
接着m行,每一行四个正整数代表xi,yi,ui,vi,保证1<=xi<=ui<=n, 1<=yi<=vi=n
请输出d[xi][yi]到d[ui][vi]的最大值
样例:
input:
3 2
1 2 1
4 1 6
5 3 2
1 1 2 2
2 1 3 3
output:
4 6
代码:
#include<bits/stdc++.h>
#define N 505
#define P 10
#define ll int
using namespace std;
ll n,m,st[P][P][N][N],LOG[N];
void ST(){//st[b-1][r][c+(1<<b-1)]
for(int i=1;i<=n;i++)LOG[i]=log(i)/log(2);
int p=LOG[n];
for(int b=1;b<=p;b++)for(int r=1;r<=n;++r)for(int c=1;c<=n-(1<<b)+1;c++)st[0][b][p][c]=max(st[0][b-1][r][c],st[0][b-1][r][c+(1<<b-1)]);
for(int a=1;a<=p;a++)for(int b=0;b<=p;++b)for(int r=1;r<=n-(1<<a)+1;++r)for(int c=1;c<=n-(1<<b)+1;++c)st[a][b][r][c]=max(st[a-1][b][r][c],st[a-1][b][r+(1<<a-1)][c]);
}
int query(int x,int y,int u,int v){//st[p][r][c2-(1<<p)+1]
int p=LOG[u-x+1],q=LOG[v-y+1];
return max(max(st[p][q][x][y],st[p][q][u-(1<<p)+1][v-(1<<q)+1]),max(st[p][q][u-(1<<p)+1][y],st[p][q][x][v-(1<<q)+1]));
}
int main(){
freopen("reward4.in","r",stdin);
freopen("reward4.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)cin>>st[0][0][i][j];
ST();
for(int i=1;i<=m;i++){int x,y,u,v;cin>>x>>y>>u>>v,cout<<query(x,y,u,v)<<" ";}
return 0;
}