Cod sursa(job #114850)

Utilizator andrei.12Andrei Parvu andrei.12 Data 15 decembrie 2007 23:51:39
Problema Plantatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include<stdio.h>
#include<algorithm>

using namespace std;

int n, m, a[505][505], d[505][505][10], x, y, lt, p, pt[20], i, j, k, mx;
int main()
{
	freopen("plantatie.in", "rt", stdin);
	freopen("plantatie.out", "wt", stdout);
	scanf("%d%d", &n, &m);
	for (i=1; i<=n; i++)
		for (j=1; j<=n; j++){
			scanf("%d", &a[i][j]);
			d[i][j][0] = a[i][j];
		}
	pt[0] = 1;
	for (i=1; i <= 10; i++)
		pt[i] = pt[i-1]*2;
	for (k=1; pt[k] <= n; k++)
		for (i=1; i<=n; i++)
			for (j=1; j<=n; j++)
				if (i+pt[k] <= n && j+pt[k] <= n){
					mx = 0;
					mx = max(mx, d[i][j][k-1]);
					mx = max(mx, d[i][j+pt[k-1]][k-1]);
					mx = max(mx, d[i+pt[k-1]][j][k-1]);
					mx = max(mx, d[i+pt[k-1]][j+pt[k-1]][k-1]);
					d[i][j][k] = mx;
				}
	for (i=1; i<=m; i++){
		scanf("%d%d%d", &x, &y, &lt);
		p = 0;
		while (pt[p+1] <= lt)
			p ++;
		mx = 0;
		mx = max(mx, d[x][y][p]);
		mx = max(mx, d[x+lt-pt[p]][y][p]);
		mx = max(mx, d[i][y+lt-pt[p]][p]);
		mx = max(mx, d[x+lt-pt[p]][y+lt-pt[p]][p]);
		printf("%d\n", mx);
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}