Cod sursa(job #912798)

Utilizator veleanduAlex Velea veleandu Data 12 martie 2013 19:27:36
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include <iostream>
#include <fstream>
using namespace std;

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

#define max_n 505
#define max_log 9

int Rmq[max_n][max_n][max_log];
int n,m,i,j,l;

int max( int a, int b, int c, int d ){
	int rez=a;
	if( b > rez )
		rez=b;
	if( c > rez )
		rez=c;
	if( d > rez )
		rez=d;
	return rez;
}

int main(){
	in>>n>>m;
	for( i=1; i<=n; ++i ){
		for( j=1; j<=n; ++j ){
			in>>Rmq[i][j][0];
		}
	}
	for( l=1; (1<<l) <= n; ++l ){
		for( i=1; i+(1<<l)-1 <= n; ++i ){
			for( j=1; j+(1<<l)-1 <= n; ++j ){
				Rmq[i][j][l] = 
				max( Rmq[i][j][l-1],
				Rmq[i][j+(1<<(l-1))][l-1],
				Rmq[i+(1<<(l-1))][j][l-1],
				Rmq[i+(1<<(l-1))][j+(1<<(l-1))][l-1]);
			}
		}
	}
	int x,y,d;
	for( ; m; --m ){
		in>>x>>y>>d;
		l=0;
		while( (1<<l) <= d )
			++l;
		--l;
		out<<
			max( Rmq[x][y][l],
			Rmq[x][y+d-(1<<l)][l],
			Rmq[x+d-(1<<l)][y][l],
			Rmq[x+d-(1<<l)][y+d-(1<<l)][l])<<"\n";
	}
	return 0;
}