Cod sursa(job #21644)

Utilizator mockeBarca Cristian Mihai mocke Data 23 februarie 2007 22:31:09
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
//100p

#include <stdio.h>
#include <string.h>
#define MMAX 9
#define NMAX 512
#define MAX(x,y) ( (x) > (y) ? (x) : (y) )

int MaxR[NMAX][NMAX][MMAX];
int N, K, x, y, z, put[NMAX], i, j, k, logn;

void read()
{
   freopen("plantatie.in", "r", stdin);

   scanf("%d %d", &N, &K);

   for(i = 1; i <= N; i++) 
	   for (j = 1; j <= N; j++)
		   scanf("%d", &MaxR[i][j][0]); 
}

void precalc()
{
  int q;

  for (q = 0, i = 1; i <= N; i++)
	  if ( i > (1 << q) && i >= ( 1 << (q+1) ) )
		  put[i] = q + 1, q++; else put[i] = q;
}

void RMQ()
{
     logn = put[N];
	 
     for (k = 1; k <= logn; k++)
         for (i = 1; i <= (N - (1<<k) + 1); i++)
			 for (j = 1; j <= (N - (1<<k) + 1); j++) 
			 {
					 int mx1 = MAX(MaxR[i][j][k-1], MaxR[i + (1<<(k-1))][j + (1<<(k-1))][k-1]);
					 int mx2 = MAX(MaxR[i + (1<<(k-1))][j][k-1], MaxR[i][j + (1<<(k-1))][k-1]);
					 MaxR[i][j][k] = MAX(mx1, mx2);
			 }
}

int query(int x, int y, int z)
{
     int t;

     t = put[z];

     int mx1 = MAX(MaxR[x][y][t], MaxR[x + z - (1<<t)][y + z - (1<<t)][t]);
	 int mx2 = MAX(MaxR[x][y + z - (1<<t)][t], MaxR[x + z - (1<<t)][y][t]);
	 
	 return MAX(mx1, mx2);
}

void solve()
{
     freopen("plantatie.out", "w", stdout);

     while (K--)
     {
          scanf("%d %d %d", &x, &y, &z);

          printf("%d\n", query(x, y, z));
     }
}

int main()
{
     read();

     precalc();

     RMQ();

     solve();

     return 0;
}