Cod sursa(job #726998)

Utilizator valentin.harsanValentin Harsan valentin.harsan Data 27 martie 2012 17:59:13
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include<iostream>
#include<fstream>
using namespace std;

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

const int N = 503;

int n,m,x[N][N],lg2[N],rmq[10][N][N];

inline int q(int x, int y, int lat) {
	int l = lg2[lat],smax = 0;
	
	smax = max(rmq[l][x][y], rmq[l][x - (1<<l) + lat][y]);
	
	if(max(rmq[l][x][y - (1<<l) + lat], rmq[l][x - (1<<l) + lat][y - (1<<l) + lat]) > smax)
		smax = max(rmq[l][x][y - (1<<l) + lat], rmq[l][x - (1<<l) + lat][y - (1<<l) + lat]);
	
	return smax;
}

int main() {
	int i,j,k,xx,y,l;
	
	in >> n >> m;
	
	for(i=1;i<=n;++i)
		for(j=1;j<=n;++j) {
			in >> x[i][j];
			rmq[0][i][j] = x[i][j];
		}
	
	lg2[1] = 0;
	
	for(i=2;i<=n;++i)
		lg2[i] = lg2[i>>1] + 1;
	
	for(k = 1; (1<<k)<=n; ++k)
		for(i=1;i<=n - (1<<k) + 1;++i)
			for(j=1;j<=n - (1<<k) + 1;++j) {
				int l = 1<<(k-1);
				
				rmq[k][i][j] = max(rmq[k-1][i][j], rmq[k-1][i+l][j]);
				
				if(max(rmq[k-1][i][j+l], rmq[k-1][i+l][j+l]) > rmq[k][i][j])
					rmq[k][i][j] = max(rmq[k-1][i][j+l], rmq[k-1][i+l][j+l]);
			}
	
	for(i=1; i<=m; ++i) {
		in >> xx >> y >> l;
		
		out << q(xx,y,l) << "\n";
	}
	
	return 0;
}