Cod sursa(job #534118)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 15 februarie 2011 11:15:54
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include<stdio.h>
#define Nmax 510

int Rmq[12][Nmax][Nmax], a[Nmax][Nmax], Lg[Nmax] ; 

int i,j,n,m,x,y,k;


void RMQ () 
{
	int i,j,k,K,A,B,C,D; 
	
	Lg[1] = 0 ;
	
	for( i = 2 ; i <= n ; i++ )
		Lg[i] = 1 + Lg[i>>1] ;
	
	K = Lg[n] ;
	
	for( i = 1 ; i <= n ; i++ )
		for( j = 1  ; j <= n ; j++ )
			Rmq[0][i][j] = a[i][j] ; 
	
	for( k = 1 ; k <= K ; k++ )
		for( i = 1 ; i + (1<<k) - 1 <= n ; i++ )
			for( j = 1 ; j + (1<<k) - 1 <= n ; j++ )
			{
				A = Rmq[k-1][i][j] ; 
				B = Rmq[k-1][i+(1<<(k-1))][j];
				C = Rmq[k-1][i][j+(1<<(k-1))];
				D = Rmq[k-1][i+(1<<(k-1))][j+(1<<(k-1))];
				
				if( A < B ) A = B ; 
				if( A < C ) A = C ; 
				if( A < D ) A = D ;
				
				Rmq[k][i][j] = A ;
			}
}

int query( int x, int y, int K ) 
{
	int  k = Lg[K], A, B, C, D ;
	
	A = Rmq[k][x][y] ; 
	B = Rmq[k][x+K-(1<<k)][y];
	C = Rmq[k][x][y+K-(1<<k)];
	D = Rmq[k][x+K-(1<<k)][y+K-(1<<k)];
	
	if( A < B ) A = B ; 
	if( A < C ) A = C ; 
	if( A < D ) A = D ;
	
	return A ;
}

int main()
{
	freopen("plantatie.in","r",stdin);
	freopen("plantatie.out","w",stdout);
	
	scanf("%d %d",&n,&m);
	
	for( i = 1 ; i <= n ; i++ )
		for( j = 1 ; j <= n ; j++ )
			scanf("%d",&a[i][j]);
	
	RMQ();
	
	for( i = 1 ; i <= m ; i++ )
	{
		scanf("%d %d %d",&x,&y,&k);
		
		printf("%d\n",query(x,y,k));
	}
	
	return 0;
}