Cod sursa(job #179203)

Utilizator znakeuJurba Andrei znakeu Data 15 aprilie 2008 18:56:45
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.13 kb
// test run no2 without inlines for everything except the "maxim" function thingy..
// note: with all the inlines removed my program ran about 30 ms slower on the last test..

#include <stdio.h>
#include <string.h>
#define MAXS 10000
#define MAXN 512
#define MAX2 16

int v[MAXN][MAXN],n,m;
int A[MAXN][MAXN][MAX2];

int p2[MAX2];
int lg2[MAXN];


inline int maxim(int a, int b)
{
	if (a<b) return b;
	return a;	
}


void citire()
{
	char c[MAXS]; int i,j,l,t;
	
	fgets(c,MAXS,stdin);
	
	i=n=m=0;
	
	while (c[i]>='0' && c[i]<='9')
		n=n*10+c[i++]-'0';
	
	i++;
	
	while (c[i]>='0' && c[i]<='9')
		m=m*10+c[i++]-'0';
	
	for (i=1; i<=n; ++i)
	{
		fgets(c,MAXS,stdin);
		for (j=1,l=0; j<=n; ++j,++l)
		{
			t=0;
			
			while (c[l]>='0' && c[l]<='9')
				t=t*10+c[l++]-'0';
			
			v[i][j]=t;
		}
	}
}

void make2()
{
	int i,j;
	
	for (i=1,p2[0]=1; i<MAX2; ++i)  
        p2[i]=p2[i-1]<<1;  
	for (i=1,j=0; i<=n; ++i)  
        if (p2[j+1]>i)  
            lg2[i]=j;  
        else  
            lg2[i]=++j; 	
}

void makea()
{
	int i,j,k,t;
	
	for (i=n; i>0; --i)
		for (j=n; j>0; --j)
		{
			A[i][j][0]=v[i][j];
			for (k=1; i+p2[k]<=n+1 && j + p2[k]<=n+1; ++k)
			{
				t=A[i][j][k-1];
				t=maxim(t,A[ i+p2[k-1] ][ j+p2[k-1] ][ k-1 ]);
				t=maxim(t,A[ i+p2[k-1] ][ j ][ k-1 ]);
				t=maxim(t,A[ i ][ j+p2[k-1] ][ k-1 ]);
				
				A[i][j][k]=t;			
			}
		}
}


void rezolva()
{
	char c[MAXS]; int i,j,x,y,L,t,l;
	
	for (i=0; i<m; ++i)
	{
		fgets(c,MAXS,stdin);
		
		j=t=x=y=L=0;
		
		while (c[j]>='0' && c[j]<='9')
			x=x*10+c[j++]-'0';
	
		j++;
		
		while (c[j]>='0' && c[j]<='9')
			y=y*10+c[j++]-'0';
		
		j++;
		
		while (c[j]>='0' && c[j]<='9')
			L=L*10+c[j++]-'0';
		
		l=lg2[L];
		
		t=A[x][y][l];
		t=maxim(t,A[ x+L-p2[l] ][ y ] [ l ]);
		t=maxim(t,A[ x ][ y+L-p2[l] ] [ l ]);
		t=maxim(t,A[ x+L-p2[l] ][ y+L-p2[l] ] [ l ]);
		
		printf("%d\n",t);		
	}	
}


int main()
{
	freopen("plantatie.in","r",stdin);
	freopen("plantatie.out","w",stdout);
	
	citire();
	make2();
	makea();
	rezolva();
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}