Cod sursa(job #812159)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 13 noiembrie 2012 15:59:31
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <fstream>
#include <stdlib.h>
#include <algorithm>
#include <math.h>
using namespace std;

ifstream fi ("plantatie.in");
ofstream fo ("plantatie.out");

const int dim = 502;
int N, M, P[dim], B[dim][dim][9];

void prepr ()
{
	int i, j, k, p, p1;
	
	fi >> N >> M;
	for (i = 1; i <= N; i++)
	{
		for (j = 1; j <= N; j++)
			fi >> B[i][j][0];
		if (i > 1)
			P[i] = P[i>>1] + 1;
	}
	
	for (k = 1; 1<<k <= N; k++)
	{
		p = 1 << k-1;
		p1 = (1<<k) - 1;
		for (i = 1; i+p1 <= N; i++)
			for (j = 1; j+p1 <= N; j++)
			{
				B[i][j][k] = max 
				(
					max (B[i][j][k-1], B[i+p][j+p][k-1]), 
					max (B[i+p][j][k-1], B[i][j+p][k-1])
				);
			}
	}
}

int query (int i, int j, int k)
{
	//c = latura celui mai mare patrat de latime 2^ceva din interior
	//r = restul pana la patratul de latime k
	int b = P[k];
	int c = 1 << b;
	int r = k - c; 
	return max
	(
		max (B[i][j][b], B[i+r][j+r][b]),
		max (B[i+r][j][b], B[i][j+r][b])
	);
}

int main ()
{
	int i, j, k;
	prepr ();
	while (M--)
	{
		fi >> i >> j >> k;
		fo << query (i, j, k) << '\n';
	}
	return 0;
}