Cod sursa(job #580381)
#include <stdio.h>
int a[12][501][501],i,j,n,m,x,y,lg[501],l,k;
int main(void)
{
freopen("plantatie.in","r",stdin);
freopen("plantatie.out","w",stdout);
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
scanf("%d",&a[0][i][j]);
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++)
{
a[k][i][j]=a[k-1][i][j+(1<<(k-1))];
if (a[k][i][j]<a[k-1][i][j])
a[k][i][j]=a[k-1][i][j];
if (a[k][i][j]<a[k-1][i+(1<<(k-1))][j])
a[k][i][j]=a[k-1][i+(1<<(k-1))][j];
if (a[k][i][j]<a[k-1][i+(1<<(k-1))][j+(1<<(k-1))])
a[k][i][j]=a[k-1][i+(1<<(k-1))][j+(1<<(k-1))];
}
for (i=2;i<=n;i++)
lg[i]=lg[i/2]+1;
int max;
for (i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&k);
l=lg[k];
max=a[l][x][y];
if (max<a[l][x][y+k-(1<<l)])
max=a[l][x][y+k-(1<<l)];
if (max<a[l][x+k-(1<<l)][y+k-(1<<l)])
max=a[l][x+k-(1<<l)][y+k-(1<<l)];
if (max<a[l][x+k-(1<<l)][y])
max=a[l][x+k-(1<<l)][y];
printf("%d\n",max);
}
return 0;
}