Cod sursa(job #1904819)

Utilizator xSliveSergiu xSlive Data 5 martie 2017 19:59:06
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <fstream>
#include <iostream>
#include <climits>

using namespace std;

ifstream f("plantatie.in");
ofstream g("plantatie.out");

int RMQ[10][510][510];
int n, m;
int lg[510];
void read()
{
	f >> n >> m;
	lg[1] = 0;
	for (int i = 1; i <= n; i++)
	{
		lg[i + 1] = lg[(i + 1) >> 1] + 1;
		for (int j = 1; j <= n; j++)
			f >> RMQ[0][i][j];
	}
		
}

inline int max(int a,int b)
{
	return a > b ? a : b;
}

inline int max(int a,int b,int c)
{
	return max(a, b) > c ? max(a, b) : c;
}

inline int max(int a,int b,int c,int d)
{
	return max(a, b, c) > d ? max(a, b, c) : d;
}

void preprocess()
{
	for (int size = 1; size <= lg[n];size++)
	{
		for (int i = 1; i <= n;i++)
		{
			for (int j = 1; j <= n;j++)
			{
				if (i + (1 << size) -1 <= n && j + (1 << size) - 1 <= n)
				{
					RMQ[size][i][j] = max(
						RMQ[size - 1][i][j],
						RMQ[size - 1][i + (1 << (size - 1))][j],
						RMQ[size - 1][i + (1 << (size - 1))][j + (1 << (size - 1))],
						RMQ[size - 1][i][j + (1 << (size - 1))]
						);
				}
				else
				{
					RMQ[size][i][j] = RMQ[size - 1][i][j];
				}
			}

		}

	}
}

int querry(int i,int j,int size)
{
	int log = lg[size];
	int dif = size - (1 << log);
	if((size & (size - 1)) == 0)
	{
		return RMQ[lg[size]][i][j];
	}
	else
	{
		return max(
			RMQ[lg[size]][i][j],
			RMQ[lg[size]][i + dif][j],
			RMQ[lg[size]][i + dif][j + dif],
			RMQ[lg[size]][i][j + dif]
			);
	}
}

void prelucration()
{
	int q, j, size;
	for (int i = 0; i < m;i++)
	{
		f >> q >> j >> size;
		g << querry(q, j, size) << '\n';
	}
}

int main()
{
	read();
	preprocess();
	prelucration();
	f.close();
	g.close();
	return 0;
}