Cod sursa(job #812154)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 13 noiembrie 2012 15:54:38
Problema Plantatie Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 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 c = 1 << P[k];
	int r = k - c; 
	if (r == 0)
	{
		return B[i][j][P[k]];
	}
	int best = max (B[i][j][P[k]], query (i + c, j + c, r));
	for (int poz = 0; poz + r <= k; poz += r)
	{
		best = max (best, max (query (i + poz, j + c, r), query (i + c, j + poz, r)));
	}
	return best;
}

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