Cod sursa(job #389186)

Utilizator alexandru92alexandru alexandru92 Data 1 februarie 2010 11:14:11
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <fstream>
#define Nmax 500
#define Log2Nmax 9

/*
 *
 */
using namespace std;
int RMQ[Nmax][Nmax][Log2Nmax];
inline int max( int x, int y, int w, int z )
{
	int maxim=x;
	if( maxim < y )
		maxim=y;
	if( maxim < w )
		maxim=w;
	if( maxim < z )
		maxim=z;
	return maxim;
}
inline int Log2( int n )
{
	int rez=0;
	if( n >= 1<<16 )
		n>>=16, rez+=16;
	if( n >= 1<<8 )
		n>>=8, rez+=8;
	if( n >= 1<<4 )
		n>>=4, rez+=4;
	if( n >= 1<<2 )
		n>>=2, rez+=2;
	if( n >= 1<<1 )
		rez+=1;
	if( !n )
		rez=-1;
	return rez;
}
int main()
{int n, m, i, j, k, c, c2, p, till, maxim;
	ifstream in( "plantatie.in" );
	in>>n>>m ;
	for( i=0; i < n; ++i)
		for( j=0; j < n; ++j )
			in>>RMQ[i][j][0];
	for( k=1; (1<<k) <= n; ++k )
	{
		c=k-1;
		c2=(1<<c);
		till=n-(1<<k)+1;
		for( i=0; i < till; ++i )
			for( j=0; j < till; ++j )
				RMQ[i][j][k]=max( RMQ[i][j][c], RMQ[i+c2][j][c], RMQ[i+c2][j+c2][c], RMQ[i][j+c2][c] );
	}
	ofstream out( "plantatie.out" );
	for( ; m; --m )
	{
		in>>i>>j>>k;
		p=Log2( k );
		c=(1<<p);
		i-=1; j-=1;
		maxim=RMQ[i][j][p];
		if( i+k-c < n )
		{
				if( maxim < RMQ[i+k-c][j][p] )
				   maxim=RMQ[i+k-c][j][p];
				if( j+k-c < n && maxim < RMQ[i+k-c][j+k-c][p] )
					maxim=RMQ[i+k-c][j+k-c][p];
		}
		if( j+k-c < n && maxim < RMQ[i][j+k-c][p] )
			maxim=RMQ[i][j+k-c][p];
		out<<maxim<<'\n';
	}
	return 0;
}