Cod sursa(job #1046089)

Utilizator miu_mik93FMI - Paduraru Miruna miu_mik93 Data 2 decembrie 2013 17:36:48
Problema Plantatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <stdio.h>
#include <iostream>
#include <string>
#include <stdlib.h>
#include <assert.h>
#include <time.h>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cstring>
#include <fstream>
#include <queue>
#include <cstdlib>
#include <iomanip>
#include <cmath>
using namespace std;

#define NMAX 501

int plant[10][NMAX][NMAX], maximPow[NMAX];

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

int maxim (int a, int b, int c)
{
	int maxCurent = max (a, b);
	return ( max (maxCurent, c) );
}

void calcMaximPow ()
{
	maximPow[1] = 0;
	for (int i = 2; i < NMAX; i++)
	{
		maximPow[i] = maximPow[i/2] + 1;
	}
}

int main ()
{
	int N, M, x, y, l;
	
	FILE *f = fopen ("plantatie.in", "r");
	FILE *g = fopen ("plantatie.out", "w");
	
	calcMaximPow();
	char *d;
	fscanf (f, "%d %d", &N, &M);
	for (int i = 1; i <= N; i++)
	{
		for (int j = 1; j <= N; j++)
		{
			fscanf (f, "%d", &plant[0][i][j]);
		}
	}
	
	int lenght = maximPow[N];
	for (int p = 1; p <= lenght; p++)
	{
		for (int i = 1; i <= N; i++)
		{
			for (int j = 1; j <= N; j++)
			{
				plant[p][i][j] = maxim (plant[p - 1][i][j], plant[p - 1][i][j + (1<<(p - 1))],
					plant[p - 1][i + (1<<(p - 1))][j]);
		
			}
		}
	}

	for (int i = 0; i < M; i++)
	{
		fscanf (f, "%d %d %d", &x, &y, &l);
		int powl = maximPow[l];
		int result1 = maxim (plant[powl][x][y], plant[powl][x][y + l - (1<<powl)],
			plant[powl][x + l - (1<<powl)][y]);

		fprintf(f, "%d", max ( plant[powl][x + l - (1<<powl)][y + l - (1<<powl)], result1 ));
	}

	fclose(f); 
	fclose(g);
	return 0;
}