Cod sursa(job #389165)

Utilizator alexandru92alexandru alexandru92 Data 1 februarie 2010 10:48:52
Problema Plantatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <fstream>
#define Nmax 510
#define Log2Nmax 10

/*
 * 
 */
using namespace std;
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 RMQ[Nmax][Nmax][Log2Nmax];
 int n, m, i, j, k, c, c2, p, till;
	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;
		out<<max( RMQ[i][j][p], RMQ[i+k-c][j][p], RMQ[i+k-c][j+k-c][p], RMQ[i][j+k-c][p] )<<'\n';
	}
	return 0;
}