Cod sursa(job #175331)

Utilizator anoukAnca Dumitrache anouk Data 9 aprilie 2008 20:50:01
Problema Plantatie Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <cstdio>
#include <iostream>
#define DIM 550
using namespace std;

int N, M, A[DIM][DIM], i, j, k, log[DIM], rmq[20][DIM][DIM];

int max(int a, int b, int c, int d)
{
	if (a > b && a > c && a > d) return a;
	if (b > a && b > c && b > d) return b;
	if (c > a && c > b && c > d) return c;
	return d;
}

int main()
{
	FILE *fin = fopen("plantatie.in", "r");
	FILE *fout = fopen("plantatie.out", "w");

	fscanf(fin, "%d%d", &N, &M);
	for (i = 1; i <= N; i++)
		for (j = 1; j <= N; j++)
		{
			fscanf(fin, "%d", &A[i][j]);
			rmq[0][i][j] = A[i][j];
		}
	for (i = 2; i <= N; i++)
		log[i] = log[i / 2] + 1;
	for (k = 1; (1 << k) <= N; k++)
		for (i = 1; i + (1 << (k - 1)) <= N; i++)
			for (j = 1; j + (1 << (k - 1)) <= N; j++)
			{
				int x = i + (1 << (k - 1));
				int y = j + (1 << (k - 1));
				rmq[k][i][j] = max(rmq[k - 1][i][j], rmq[k - 1][x][j], rmq[k - 1][i][y], rmq[k - 1][x][y]);
			}
	for (int t = 1; t <= M; t++)
	{
		fscanf(fin, "%d%d%d", &i, &j, &k);
		int lg = log[k];
		int x = i + k - (1 << lg);
		int y = j + k - (1 << lg);
		fprintf(fout, "%d\n", max(rmq[lg][i][j], rmq[lg][x][j], rmq[lg][i][y], rmq[lg][x][y]));
	}

	fclose(fin);
	fclose(fout);
	return 0;
}