Cod sursa(job #2616107)

Utilizator mareadevarIonescu Andrei mareadevar Data 16 mai 2020 18:46:31
Problema Plantatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <bits/stdc++.h>
#define NMAX 502
 using namespace std;
 ifstream f("plantatie.in");
 ofstream g("plantatie.out");
int a[NMAX][NMAX][12];
int n, m;

void read()
{
	int i, j;
f>>n>>m;
	for(i = 1; i <= n; ++i)
		for(j = 1; j <= n; ++j)
			f>>a[i][j][0];

}
void solve()
{
	int i, j, k, aux;
	for(k = 1; k <= 9; ++k)
		for(i = 1, aux = (1<<(k-1)); i <= n; ++i)
			for(j = 1; j <= n; ++j)
			{
				a[i][j][k] = a[i][j][k-1];
				if(i + aux <= n && a[i][j][k] < a[i + aux][j][k-1])
					a[i][j][k] = a[i + aux][j][k-1];
				if(j + aux <= n && a[i][j][k] < a[i][j + aux][k-1])
					a[i][j][k] = a[i][j + aux][k-1];
		if(j + aux <= n && i + aux <= n && a[i][j][k] < a[i + aux][j + aux][k-1])
					a[i][j][k] = a[i + aux][j + aux][k-1];
			}
}

void query()
{
	int max, i, x, y, z, p, p2;
	int pow[NMAX], pow2[NMAX];

	for(pow[0] = pow[1] = 1, pow2[1] = pow2[0] = 0, i = 2; i < NMAX; ++i)
		if(pow[i-1]*2 <= i)
			pow[i] = pow[i-1]*2, pow2[i] = 1+pow2[i-1];
		else
			pow[i] = pow[i-1], pow2[i] = pow2[i-1];

	for(i = 0; i < m; ++i)
	{
		f>>x>>y>>z;
		p2 = pow[z];
		p =  pow2[z];

		max = a[x][y][p];

		if(x+z-p2 > 0 && x+z-p2 <= n && a[x+z-p2][y][p] > max)
			max = a[x+z-p2][y][p];

		if(y+z-p2 > 0 && y+z-p2 <= n && a[x][y+z-p2][p] > max)
			max = a[x][y+z-p2][p];

		if(x+z-p2 > 0 && x+z-p2 <= n && y+z-p2 > 0 && y+z-p2 <= n && a[x+z-p2][y+z-p2][p] > max)
			max = a[x+z-p2][y+z-p2][p];

		g<<max;
	}
}

void print()
{
	int i, j, k;
	for(k = 0; k <= 5; ++k)
	{
		g<<k;
		for(i = 1; i <= n; ++i)
		{
			for(j = 1; j <= n; ++j)
				g<<a[i][j][k]<<endl;

                }
		g<<endl;
	}
}

int main()
{


	read();

	solve();

	//print();
        query();

	return 0;
}