Cod sursa(job #71283)

Utilizator blasterzMircea Dima blasterz Data 9 iulie 2007 22:52:17
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+k)-(1<<v)][j];
  sol>?=dp[v][i][(j+k)-(1<<v)];
  sol>?=dp[v][(i+k)-(1<<v)][(j+k)-(1<<v)];
  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;
}