Cod sursa(job #825932)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 29 noiembrie 2012 20:32:12
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include<fstream>
#include<cmath>
using namespace std;
int n,Q,mat[510][510];
int rmq[510][510][10],logaritm2[510];

inline void RMQ()
{
	int i,j,k,p;
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			rmq[i][j][0]=mat[i][j];
	for(k=1;(1<<k)<=n;k++)
	{
		p=(1<<(k-1));
		for(i=1;i+(1<<k)<=n+1;i++)
		{
			for(j=1;j+(1<<k)<=n+1;j++)
			{
				rmq[i][j][k]=max(max(rmq[i][j][k-1],rmq[i+p][j][k-1]),max(rmq[i][j+p][k-1],rmq[i+p][j+p][k-1]));
			}
		}
	}
	logaritm2[1]=0;
	for(i=2;i<=n;i++)
		logaritm2[i]=logaritm2[i/2]+1;
}

int main()
{
	int i,j,k,p,dif;
	ifstream fin("plantatie.in");
	ofstream fout("plantatie.out");
	fin>>n>>Q;
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			fin>>mat[i][j];
	RMQ();
	while(Q--)
	{
		fin>>i>>j>>k;
		p=logaritm2[k];
		dif=k-(1<<p);
		fout<<max(max(rmq[i][j][p],rmq[i+dif][j][p]),max(rmq[i][j+dif][p],rmq[i+dif][j+dif][p]))<<"\n";
	}
	fin.close();
	fout.close();
	return 0;
}