Pagini recente » Borderou de evaluare (job #571818) | Cod sursa (job #1006199)
#include <cstdio>
#define Nmax 512
#define inf 0x3f3f3f3f
using namespace std;
int N, M, a[Nmax][Nmax], lg[Nmax], p[Nmax], v[Nmax][Nmax][10];
inline int max(int a, int b, int c = inf, int d = inf){
int m = a;
if(b > m)
m = b;
if(c > m)
m = c;
if(d > m)
m = d;
return m;
}
int main(){
freopen("plantatie.in", "r", stdin);
freopen("plantatie.out", "w", stdout);
scanf("%d%d",&N,&M);
for(int i = 1; i <= N; ++i)
for(int j = 1; j <= N; ++j)
scanf("%d", &a[i][j]);
//Precalculam
//v[i][j][k] -> coltul in i,j, lungime latura k
for(int i = 1; i <= N; ++i)
for(int j = 1; j <= N; ++j)
v[i][j][0] = a[i][j];
int pw = 2;
p[0] = 1;
for(int k = 1; pw <= N; k++, pw*=2){
for(int i = 1; i <= N - pw + 1; ++i)
for(int j =1; j <= N - pw + 1; ++j){
int lastPow = pw/2;
v[i][j][k] = max( v[i][j][k-1], v[i+lastPow][j][k-1], v[i][j+lastPow][k-1], v[i+lastPow][j+lastPow][k-1] );
}
p[k] = pw;
}
//Preprocesam log2
lg[1] = 0;
for(int i = 2; i <= N; ++i){
lg[i] = lg[i/2] + 1;
}
//Query-uri
for(int i = 1; i <= M; ++i){
int x, y, k;
scanf("%d%d%d",&x,&y,&k);
int log = lg[k];
int sol = max( v[x][y][log], v[x + k - p[log]][y][log], v[x][y + k - p[log]][log], v[x + k - p[log]][y + k - p[log]][log]);
printf("%d\n", sol);
}
return 0;
}