Cod sursa(job #970066)

Utilizator cont_de_testeCont Teste cont_de_teste Data 5 iulie 2013 22:18:49
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <algorithm>
#include <iostream>
#include <fstream>
#include <cstdio>
using namespace std;


const char INAME[] = "plantatie.in";
const char ONAME[] = "plantatie.out";
const int NMax = 510;
const int LogMax = 10;

ifstream fin("plantatie.in");
ofstream fout(ONAME);


int N, M, A[NMax][NMax];
int R[LogMax][NMax][NMax];
int LG[NMax];


void Read() {
	fin >> N >> M;
	for (int i = 1; i <= N; i++)
		for (int j = 1; j <= N; j++)
			fin >> A[i][j];
}

void Solve() {
	for (int i = 1; i <= N; i++)
		for (int j = 1; j <= N; j++)
			R[0][i][j] = A[i][j];
	for (int lg = 1; lg < LogMax; lg++)
		for (int i = 1; i <= N; i++)
			for (int j = 1; j <= N; j++) {
				if (i + (1 << lg) - 1 > N || j + (1 << lg) - 1 > N)
					break;
				int mdl = i + (1 << (lg - 1));
				int mdc = j + (1 << (lg - 1));
				R[lg][i][j] = max(
								max(
									R[lg - 1][i][j],
									R[lg - 1][mdl][j]
								)
								,
								max(
									R[lg - 1][i][mdc],
									R[lg - 1][mdl][mdc]
								)
							  );
			}
	LG[2] = 1;
	for (int i = 3; i < NMax; i++)
		LG[i] = LG[i / 2] + 1;
}

inline int query(int x, int y, int L) {
	int lg = LG[L];
	int mdl = x + L - 1 - (1 << lg) + 1;
	int mdc = y + L - 1 - (1 << lg) + 1;
	return max(
				max(
					R[lg][x][y],
					R[lg][mdl][y]
				)
				,
				max(
					R[lg][x][mdc],
					R[lg][mdl][mdc]
				)
			);
					
}
void Write() {
	for (int i = 1; i <= M; i++) {
		int X, Y, L;
		fin >> X >> Y >> L;
		fout << query(X, Y, L) << '\n';
	}
}



int main() {
	Read(); Solve(); Write();
}