Cod sursa(job #20354)

Utilizator damaDamaschin Mihai dama Data 21 februarie 2007 11:17:37
Problema Plantatie Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include <stdio.h>
#include <math.h>

int a[513][513], m[513][513][10], n, nr;

inline int min(int a, int b)
{
	if(a > b)
		return a;
	return b;
}

int main()
{
	freopen("plantatie.in","r",stdin);
	freopen("plantatie.out","w",stdout);
	
	int i, j, k, p, q, sol;
	
	scanf("%d%d", &n, &nr);
	
	for(i = 1; i <= n; ++i)
	{
		for(j = 1; j <= n; ++j)
		{
			scanf("%d", &a[i][j]);
			m[i][j][0] = a[i][j];
		}
	}
	
	for(k = 1; (1 << k) <= n; ++k)
	{
		for(i = 1; i + (1 << (k - 1)) <= n; ++i)
		{
			for(j = 1; j + (1 << (k - 1)) <= n; ++j)
			{
				m[i][j][k] = min(min(m[i][j][k - 1], m[i + (1 << (k - 1))][j][k - 1]), min(m[i][j + (1 << (k - 1))][k - 1], m[i + (1 << (k - 1))][j + (1 << (k - 1))][k - 1]));	
			}
		}
	}
	
	for(q = 1; q <= nr; ++q)
	{
		scanf("%d%d%d", &i, &j, &k);
		p = log(k);
		sol = min(min(m[i][j][p], m[i][j + k - (1 << p)][p]), min(m[i + k - (1 << p)][j][p], m[i + k - (1 << p)][j + k - (1 << p)][p]));
		printf("%d\n", sol); 
	}
	
	return 0;
}