Cod sursa(job #594108)

Utilizator Catah15Catalin Haidau Catah15 Data 6 iunie 2011 11:47:26
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <iostream>

using namespace std;

#define maxN 505
#define LL long long


LL lg[maxN], RMQ[10][maxN][maxN], A[maxN][maxN];


int main()
{
	freopen ("plantatie.in", "r", stdin);
	freopen ("plantatie.out", "w", stdout);
	
	int N, M;
	
	scanf ("%d %d", &N, &M);
	
	for (int i = 1; i <= N; ++ i)
		for (int j = 1; j <= N; ++ j)
		{
			scanf ("%d", &A[i][j]);
			
			RMQ[0][i][j] = A[i][j];
		}
	
	
	for (int t = 1; (1 << t) <= N; ++ t)
		for (int i = 1; i <= N - (1 << t) + 1; ++ i)
			for (int j = 1; j <= N - (1 << t) + 1; ++ j)
			{
				RMQ[t][i][j] = max ( RMQ[t - 1][i][j], RMQ[t - 1][i + (1 << (t - 1))][j] );
				RMQ[t][i][j] = max ( RMQ[t][i][j], RMQ[t - 1][i][j + (1 << (t - 1))] );
				RMQ[t][i][j] = max ( RMQ[t][i][j], RMQ[t - 1][i + (1 << (t - 1))][j + (1 << (t - 1))] );
			}
	
	
	for (int i = 2; i <= N; ++ i)
		lg[i] = lg[i / 2] + 1;
	
	
	while (M --)
	{
		int x, y, k;
		
		scanf ("%d %d %d", &x, &y, &k);
		
		LL q = lg[k];
		
		LL qq = k - (1 << q);
		
		LL sol = max (RMQ[q][x][y], RMQ[q][x + qq][y]);
		sol = max (sol, RMQ[q][x][y + qq]);
		sol = max (sol, RMQ[q][x + qq][y + qq]);
		
		printf ("%lld \n", sol);
	}
	
	
	return 0;
}