Cod sursa(job #71277)

Utilizator gigi_becaliGigi Becali gigi_becali Data 9 iulie 2007 22:29:40
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
using namespace std;
#include <cstdio>
#include <algorithm>
#define maxn 512
#define maxlog 10
int dp[maxlog][maxn][maxn];
int n, m;

void read()
{
  freopen("plantatie.in","r",stdin);
  scanf("%d %d\n", &n, &m);
  int i, j;
  for(i=1;i<=n;++i)
    for(j=1;j<=n;++j) scanf("%d ", &dp[0][i][j]);
}

void init()
{
  int i, j, k;

  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)
	{
	  dp[k][i][j]=dp[k-1][i+(1<<(k-1))][j+(1<<(k-1))];
	  dp[k][i][j]>?=dp[k-1][i][j];
	  dp[k][i][j]>?=dp[k-1][i+(1<<(k-1))][j];
	  dp[k][i][j]>?=dp[k-1][i][j+(1<<(k-1))];
	}
	  
}
int query(int i, int j, int k)
{
  int t=k;
  int v;
  for(v=1;(1<<v)<t;++v);
  if((1<<v)>t)--v;
  int sol=dp[v][i][j];
  sol>?=dp[v][i-(1<<v)+k][j];
  sol>?=dp[v][i][j-(1<<v)+k];
  sol>?=dp[v][i-(1<<v)+k][j-(1<<v)+k];
  return sol;

}

void solve()
{
  int i, j, k;
  while(m--)
    {
      scanf("%d %d %d\n", &i, &j, &k);
      printf("%d\n", query(i, j, k));
    }
      


}

int main()
{
  freopen("plantatie.out","w",stdout);
  read();
  init();
  solve();
  
  return 0;
}