Cod sursa(job #133593)

Utilizator florin_marius90Florin Marius Popescu florin_marius90 Data 9 februarie 2008 01:30:26
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <cstdio>   
#include <algorithm>   
  
const int maxn = 501;   
const int maxm = 75001;   
  
FILE *in = fopen("plantatie.in","r"), *out = fopen("plantatie.out","w");   
  
int n, m;   
int b[maxn][maxn][10];   
  
void read()   
{   
    fscanf(in, "%d %d", &n, &m);   
  
    for ( int i = 1; i <= n; ++i )   
        for ( int j = 1; j <= n; ++j )   
            fscanf(in, "%d", &b[i][j][0]);   
}   
  
int h[4];   
int max(int x, int y, int p, int q)   
{   
    h[0] = x, h[1] = y, h[2] = p, h[3] = q;   
  
    int ret = h[0];   
    for ( int i = 1; i < 4; ++i )   
        if ( h[i] > ret )   
            ret = h[i];   
  
    return ret;   
}   
  
void prec()   
{   
    for ( int k = 1; 1 << k <= n; ++k)   
        for ( int i = 1; i <= n; ++i )   
            for ( int j = 1; j <= n; ++j )   
            {   
                int p = 1 << (k - 1);   
                if ( i + p <= n && j + p <= n )   
                    b[i][j][k] = max(b[i][j][k-1], b[i][j+p][k-1], b[i+p][j][k-1], b[i+p][j+p][k-1]);   
            }   
}   
  
int main()   
{   
    read();   
    prec();   
  
    int x, y, z;   
  
    for ( int i = 1; i <= m; ++i )   
    {   
        fscanf(in, "%d %d %d", &x, &y, &z);   
  
        int p = 0;   
        while ( 1 << p <= z )   
            ++p;   
        --p;   
  
        int pp = 1 << p;   
  
        fprintf(out, "%d\n", max(b[x][y][p], b[x][y+z-pp][p], b[x+z-pp][y][p], b[x+z-pp][y+z-pp][p]));   
    }   
  
  
    return 0;   
}