Cod sursa(job #18255)

Utilizator webspiderDumitru Bogdan webspider Data 18 februarie 2007 11:04:08
Problema Plantatie Scor 70
Compilator cpp Status done
Runda preONI 2007, Runda 2, Clasa a 10-a Marime 1.75 kb
#include <stdio.h>
#include <iostream>

using namespace std;

const int mar[9] = { 1, 2, 5, 11, 23, 47, 95, 191, 383 };

int map[501][501][9];
int n,m;
int asd[10];

int x,y,l;

int maxc( int a[], int k )
{
	int mmax = 0;
	int l;
	for ( l = 1; l <= k; l++ )
		mmax = max ( mmax, a[l] );
	return mmax;
}

int main()
{
	int i,j,lung;
	freopen("plantatie.in","r",stdin);
	freopen("plantatie.out","w",stdout);

	scanf("%d %d\n" ,&n, &m);

	for ( i = 1; i <= n; i++ )
		for ( j = 1; j <= n; j++ ) 
	{
			scanf("%d ", &map[i][j][0]);
			if ( i != 1 && j != 1 )
			{
				asd[1] = map[i-1][j-1][0];
				asd[2] = map[i][j][0];
				asd[3] = map[i-1][j][0];
				asd[4] = map[i][j-1][0];
				
				map[i-1][j-1][1] = maxc( asd, 4 );
			}
	}

	for ( lung = 2; lung <= 8; lung++ )
	{
		for ( i = 1; i <= n-lung+1; i++ )
			for ( j = 1; j <= n-lung+1;j++ )
			{
				asd[1] = map[ i ][ j ][ lung-1 ];
			        asd[2] = map[ i ][ j+mar[lung-1] ][ lung-1 ];
			        asd[3] = map[ i ][ j+mar[lung-1]+1 ][ lung-1 ];
			        asd[4] = map[ i+mar[lung-1] ][ j ][ lung-1 ];
			        asd[5] = map[ i+mar[lung-1]+1 ][ j ][ lung-1 ];
				asd[6] = map[ i+mar[lung-1] ][ j+mar[lung-1] ][ lung-1 ];
				asd[7] = map[ i+mar[lung-1] ][ j+mar[lung-1]+1 ][ lung-1 ];
				asd[8] = map[ i+mar[lung-1]+1 ][ j+mar[lung-1] ][ lung-1 ];
				asd[9] = map[ i+mar[lung-1]+1 ][ j+mar[lung-1]+1 ][ lung-1 ];

				map[i][j][lung] = maxc( asd, 9 );
			}
	}

	while ( m )
	{
		m--;

		scanf("%d %d %d\n", &x, &y, &l );
		for ( i = 8; i >= 0; i-- )
			if ( l >= mar[i] ) break;

		asd[1] = map[ x ][ y ][ i ];
		asd[2] = map[ x+(l-mar[i]) ][ y ][ i ];
		asd[3] = map[ x ][ y+(l-mar[i]) ][ i ];
		asd[4] = map[ x+(l-mar[i]) ][ y+(l-mar[i]) ][ i ];

		printf("%d\n", maxc( asd, 4 ) );
	}

	fclose(stdin);
	fclose(stdout);

	return 0;
}