Cod sursa(job #514165)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 17 decembrie 2010 22:44:50
Problema Plantatie Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include<stdio.h>

FILE*f=fopen("plantatie.in","r");
FILE*g=fopen("plantatie.out","w");

int N,Q,i,j,A[512][512],p2[12],M[512][512][11],E[15],R,L,e,k;

int max ( int a, int b, int c ,int a2,int b2,int c2,int a3,int b3,int c3,int a4,int b4,int c4 ){
	int max = 0;
	
	if ( a >= 0 && a <= 510 && b >= 0 && b <= 510 && c >= 0 && c <= 510 )
		max = M[a][b][c] > max ? M[a][b][c] : max;
	if ( a2 >= 0 && a2 <= 510 && b2 >= 0 && b2 <= 510 && c2 >= 0 && c2 <= 510 )
		max = M[a2][b2][c2] > max ? M[a2][b2][c2] : max;
	if ( a3 >= 0 && a3 <= 510 && b3 >= 0 && b3 <= 510 && c3 >= 0 && c3 <= 510 )
		max = M[a3][b3][c3] > max ? M[a3][b3][c3] : max;
	if ( a4 >= 0 && a4 <= 510 && b4 >= 0 && b4 <= 510 && c4 >= 0 && c4 <= 510 )
		max = M[a4][b4][c4] > max ? M[a4][b4][c4] : max;
	return max;
	
}

int main () {
	
	fscanf(f,"%d %d",&N,&Q);
	
	for ( i = 1 ; i <= N ; ++i ){
		for ( j = 1 ; j <= N ; ++j ){
			fscanf(f,"%d",&A[i][j]);
			M[i][j][0] = A[i][j];
		}
		E[ i + 1 ] = E[ ( i + 1 ) / 2 ] + 1;
	}
	for ( i = 0 ; i <= N ; ++i ){
		for ( j = 0 ; j <= N ; ++j )
			for ( k = 1 ; k <= 10 ; ++k )
				M[i][j][k] = -1;
			
	}
	
	//M[i][j][k] = maximul din patratul cu coltul stanga-sus in i si j si latura 2 ^ k
	
	for ( i = 1, p2[0] = 1 ; p2[i-1] <= 512 ; p2[i] = 2 * p2[i-1] , ++i ) {};
	
	for ( k = 1 ; k <= E[N] ; ++k ){
		for ( i = 1 ; i <= N ; ++i ){
			for ( j = 1 ; j <= N ; ++j ){
				M[i][j][k] = max(i,j,k-1,i+p2[k]/2,j,k-1,i,j+p2[k]/2,k-1,i+p2[k]/2,j+p2[k]/2,k-1);
			}
		}
	}
	
	while ( Q-- ) {
		fscanf(f,"%d %d %d",&i,&j,&L);
		e = E[L];
		R = max(i,j,e,i+L-p2[e],j,e,i,j+L-p2[e],e,i+L-p2[e],j+L-p2[e],e);
		fprintf(g,"%d\n",R);
	}
	
	
	fclose(f);
	fclose(g);
	
	return 0;
}