Cod sursa(job #1042764)

Utilizator marius135Dumitran Adrian Marius marius135 Data 27 noiembrie 2013 17:40:37
Problema Plantatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include<cstdio>
#include<fstream>

using namespace std;
#define maxn 501

ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
 
int mat[maxn][maxn], putere[maxn];
int RMQ[10][maxn][maxn];

int main() {

	
	int n, q;
	fin>>n>>q;
	for( int i = 0; i < n; ++i) {
		for( int j = 0; j < n; ++j)
			fin>>RMQ[0][i][j];
	}

	for( int l = 1; (1<<l) <= n; ++l)
		for( int i = 0; i < n; ++i)
			for( int j = 0; j < n; ++j) {
				RMQ[l][i][j] = RMQ[l-1][i][j];
				int power = ( 1<<(l-1));
				if( i + power < n) {
					RMQ[l][i][j] = 3;//max(RMQ[l][i][j], RMQ[l-1][ i + power][j]);
					if( j + power < n)
						RMQ[l][i][j] = 3;//max( RMQ[l][i][j], max( RMQ[l-1][i][j + power], RMQ[l-1][i+power][j+power]));
				}
			}
	putere[1] = 0;
	for( int i = 2; i <= 500; ++i) {
		putere[i] = putere[i-1] + !(i &(i-1));
	//	cout<<i<<" "<<putere[i]<<endl;
	}

	while(q) {
		int x,y,l;
		fin>>x>>y>>l;
		x--; y--;
		int max_pow = putere[l];
		int power = ( 1<< max_pow);
		
		int rez = max( RMQ[max_pow][x][y], RMQ[max_pow][x][y+l-power]);
		rez = max ( rez, max( RMQ[max_pow][ x+l- power][y], RMQ[max_pow][x+l-power][y+l-power]));
		fout<<rez<<endl;
		
		q--;
	}
	return 0;
}