Cod sursa(job #175357)

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

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

int maxim(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[i][j][0] = 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++)
			{
				x = i + (1 << (k-1));  
				y = j + (1 << (k-1));  
				rmq[i][j][k] = maxim(rmq[i][j][k-1], rmq[i][y][k-1], rmq[x][j][k-1], rmq[x][y][k-1]);          
			}  

	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", maxim(rmq[i][j][lg], rmq[x][j][lg], rmq[i][y][lg], rmq[x][y][lg]));
	}

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