Cod sursa(job #19463)

Utilizator alex_damianDamian Alexandru alex_damian Data 19 februarie 2007 17:14:26
Problema Plantatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <cstdio>

#define FIN "plantatie.in"
#define FOUT "plantatie.out"
#define MAXN 505
#define max(x,y) ((x>y) ? (x) : (y))

long mat[MAXN][MAXN][9], n, m, i, j, x, y, z, v;

int main() {
	freopen(FIN, "r", stdin);
  freopen(FOUT, "w", stdout);
  scanf("%ld %ld", &n, &m);
  for (i=1;  i<=n; i++) for (j=1; j<=n; j++) scanf("%ld", &mat[i][j][0]);
  for (x=1; x<=8; x++)
     for (i=n; i>0; i--)
        for (j=n; j>0; j--) {
           mat[i][j][x] = mat[i][j][x-1];
           if (i+(1<<x) <=n) mat[i][j][x] = max(mat[i][j][x], mat[i+(1<<x)][j][x-1]);
           if (i+(1<<x) <=n && (j+(1<<x) <=n)) mat[i][j][x] = max(mat[i][j][x], mat[i+(1<<x)][j+(1<<x)][x-1]);
           if (j+(1<<x) <=n) mat[i][j][x] = max(mat[i][j][x], mat[i][j+(1<<x)][x-1]);
        }
  for (i=1; i<=m; i++) {
     scanf("%ld %ld %ld", &x, &y, &z);
     j = (1<<8);
     while (j>z) j = j>>1;
     v = mat[x][y][j];
     v = max(v, mat[x+z-(1<<j)][y][j]);
     v = max(v, mat[x][y+z-(1<<j)][j]);
     printf("%ld\n", v);
  }
	return 0;
}