Cod sursa(job #19676)

Utilizator m_dersidanDersidan Mihai m_dersidan Data 19 februarie 2007 20:46:42
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
# include <stdio.h>

# define  _fin  "plantatie.in"
# define  _fout "plantatie.out"

# define  maxn  512


int b[maxn][maxn];
int a[maxn][maxn][9];
int n, m;


inline int pow2(int k) { return 1 << k; }
inline int max(int a, int b) { return a>b?a:b; }
inline int max(int a, int b, int c, int d) { return max( max(a, b), max(c, d) ); }


void readf()
{
	freopen(_fin, "r", stdin);
	int i, j;
	
	for (scanf("%d %d", &n, &m), i=1; i<=n; i++)
		for (j=1; j<=n; j++)
			 scanf("%d", &b[i][j]);
}

void solve()
{
	freopen(_fout, "w", stdout);

	int to, i, j, k, p, ti;
	
	for (to=0; pow2(to)<=n; ++to); --to;
	
	for (i=1; i<=n; i++)
		for (j=1; j<=n; j++)
			a[i][j][0] = b[i][j];
	
	for (k=1; k<=to; k++)
		for (ti=i-pow2(k-1), i=1; i<=ti; i++)
			for (j=1; j<=ti; j++)
				a[i][j][k] = max( a[i][j][k-1], a[i+pow2(k-1)][j][k-1], a[i][j+pow2(k-1)][k-1], a[i+pow2(k-1)][j+pow2(k-1)][k-1] );
	
	for (; m; --m)
	{
		scanf("%d%d%d", &i, &j, &k);
		for (p=0; pow2(p)<=k; p++); --p;
		
		printf("%d\n", max( a[i][j][p], a[i][j+k-pow2(p)][p], a[i+k-pow2(p)][j][p], a[i+k-pow2(p)][j+k-pow2(p)][p] ) );
	}
}

int main()
{
	readf();
	solve();
	
	return 0;
}