Cod sursa(job #590438)

Utilizator andra23Laura Draghici andra23 Data 17 mai 2011 14:19:24
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include<fstream>

using namespace std;

const int maxn = 505;
int c[maxn][maxn][12], a[maxn][maxn];
int logarithm[maxn];
ofstream g("plantatie.out");

void calculateLogarithm(int n) {
	logarithm[1] = 0;
	int next = 2;
	for (int i = 2; i <= n; i++) {
		logarithm[i] = logarithm[i-1];
		if (i == next) {
			logarithm[i]++;
			next = next*2;	
		}	
	}	
}

void preprocessMatrix(int n) {
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++) 
			c[i][j][0] = a[i][j];		
		
	for (int k = 1; (1<<k) <= n; k++) {
		for (int i = 1; i + (1<<k) - 1 <= n; i++)
			for (int j = 1; j + (1<<k) - 1 <= n; j++) {
				int x = c[i][j][k-1];
				int l = (1 << (k-1));
				
				int y = c[i+l][j][k-1];
				if (y > x)
					x = y;
					
				y = c[i][j+l][k-1];
				if (y > x)
					x = y;
					
				y = c[i+l][j+l][k-1];
				if (y > x)
					x = y;
				
				c[i][j][k] = x;
			}
	}
}

int main() {
	ifstream f("plantatie.in");
		
	int n, m;
	f >> n >> m;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			f >> a[i][j];
	
	preprocessMatrix(n);
	calculateLogarithm(n);
	
	int x1, y1, l;
	for (int i = 1; i <= m; i++) {
		f >> x1 >> y1 >> l;
		int x2 = x1+l-1;
		int y2 = y1+l-1;	
		int k = logarithm[l];
		int maxim = c[x1][y1][k];
		int secondMax = c[x2-(1<<k)+1][y1][k];
		if (secondMax > maxim)
			maxim = secondMax;
		secondMax = c[x1][y2-(1<<k)+1][k];
		if (secondMax > maxim)
			maxim = secondMax;
		secondMax = c[x2-(1<<k)+1][y2-(1<<k)+1][k];
		if (secondMax > maxim)
			maxim = secondMax;
		g << maxim << '\n';
		}
	
	return 0;
}