Cod sursa(job #805868)

Utilizator VincentVegaVincent Vega VincentVega Data 1 noiembrie 2012 12:59:19
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <iostream>
#include <fstream>
#define NMAX 510
using namespace std;

int N, M;
int a[NMAX][NMAX], log[NMAX];
int rmq[NMAX << 1][NMAX << 1][10];

inline int MAX(int a, int b, int c, int d)
{
	int ret = 0;
	if (ret < a) ret = a;
	if (ret < b) ret = b;
	if (ret < c) ret = c;
	if (ret < d) ret = d;
	return ret;
}

void DEBUGmat(int l)
{
	for (int i = 1; i <= N; ++i)
	{
		for (int j = 1; j <= N; ++j)
		{
			cout << rmq[i][j][l] << ' ';
		}
		cout << '\n';
	}
}

inline void maker(int i, int j, int cnt)
{
	int tnc = cnt - 1;
	rmq[i][j][cnt] = MAX(
	rmq[i][j][tnc],
	rmq[i][j + (1 << tnc)][tnc],
	rmq[i + (1 << tnc)][j][tnc],
	rmq[i + (1 << tnc)][j + (1 << tnc)][tnc]);
}

inline int query(int i, int j, int k)
{
	int vega = 1 << log[k];
	return MAX(rmq[i][j][log[k]], rmq[i][j + k - vega][log[k]], rmq[i + k - vega][j][log[k]], rmq[i + k - vega][j + k - vega][log[k]]);
}

int main()
{
	ifstream fin("plantatie.in");
	ofstream fout("plantatie.out");
	
	fin >> N >> M;
	for (int i = 1; i <= N; ++i)
	{
		for (int j = 1; j <= N; ++j)
		{
			fin >> a[i][j];
		}
	}
	
	log[1] = 0;
	for (int i = 2, p = 2; i < NMAX; ++i)
	{
		log[i] = log[i - 1];
		if (i == p)
		{
			++log[i];
			p <<= 1;
		}
	}
	
	for (int i = 1; i <= N; ++i)
	{
		for (int j = 1; j <= N; ++j)
		{
			rmq[i][j][0] = a[i][j];
		}
	}
	
	for (int k = 1; k <= 9; ++k)
	{
		if (!((1 << k) <= N)) break;
		for (int i = 1; i <= N; ++i)
		{
			for (int j = 1; j <= N; ++j)
			{
				maker(i, j, k);
			}
		}
	}
	
	
	for (int i = 1; i <= M; ++i)
	{
		int l, c, n;
		fin >> l >> c >> n;
		
		fout << query(l, c, n) << '\n';
	}
	
	fout.close();
	return 0;
}