Cod sursa(job #175315)

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

int N, M, A[DIM][DIM], x, y, 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);
	//cout << N << " " << M; cin.get();
	int XX, YY;
	for (int i = 1; i <= N; i++)
		for (int j = 1; j <= N; j++)
		{
			fscanf(fin, "%d", &A[i][j]);
			//cout << i << " " << j << " " << A[i][j] << " " << XX << " " << YY; cin.get();
			rmq[0][i][j] = A[i][j];
		}
	for (int i = 2; i <= N; i++)
		log[i] = log[i / 2] + 1;
	for (int t = 1; (1 << t) <= N; t++)
		for (int i = 1; i <= N - (1 << t) + 1; i++)
			for (int j = 1; j <= N - (1 << t) + 1; j++)
			{
				int a = i + (1 << (t - 1));
				int b = j + (1 << (t - 1));
				rmq[t][i][j] = max(rmq[t - 1][i][j], rmq[t - 1][a][j], rmq[t - 1][i][b], rmq[t - 1][a][b]);
			}
/*	for (int i = 1; i <= N; i++)
	{
		for (int j = 1; j <= N; j++)
			cout << A[i][j] << " ";
		cout << "\n";
	}
	cin.get();	*/
	for (int i = 1; i <= M; i++)
	{
		fscanf(fin, "%d%d%d", &x, &y, &k);
		//cout << M << " " << x << " " << y << " " << k; cin.get();
		int lg = log[k];
		int a = x + k - (1 << lg);
		int b = y + k - (1 << lg);
		//cout << rmq[]; cin.get();
		fprintf(fout, "%d\n", max(rmq[lg][x][y], rmq[lg][a][y], rmq[lg][x][b], rmq[lg][a][b]));
	}

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