Pagini recente » Cod sursa (job #83063) | Cod sursa (job #51363) | Cod sursa (job #3236351) | Cod sursa (job #18741)
Cod sursa(job #18741)
#include<stdio.h>
int long max[501][501][9][3],n;
void init_max()
{int long i,j,k,d;
for(k=1;(1<<k)<=n;k++)
for(i=1;i<=n;i++)
{for(j=1;j+(1<<k)-1<=n;j++)
{max[i][j][k][0]=max[i][j][k-1][0];
if(max[i][j][k][0]<max[i][j+(1<<(k-1))][k-1][0])
max[i][j][k][0]=max[i][j+(1<<(k-1))][k-1][0];
}
for(;j<=n;j++)
max[i][j][k][0]=max[i][j][k-1][0];
}
for(k=0;(1<<k)<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{max[i][j][k][1]=max[i][j][k][0];
for(d=1;d<=4&&d+i<=n;d++)
if(max[i][j][k][1]<max[i+d][j][k][0])
max[i][j][k][1]=max[i+d][j][k][0];
}
for(k=0;(1<<k)<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{max[i][j][k][2]=max[i][j][k][1];
for(d=5;d<=20&&d+i<=n;d+=5)
if(max[i][j][k][2]<max[i+d][j][k][1])
max[i][j][k][2]=max[i+d][j][k][1];
}
}
int long rezolva(int long x,int long y,int long z,int long zz)
{int long i,j,ii,maxim=-2000000000;
for(i=8;i>=0;i--)
if(zz&(1<<i))
{for(j=0;j<z/25;j++)
if(maxim<max[x+j*25][y][i][2])
maxim=max[x+j*25][y][i][2];
for(ii=0;ii<(z%25)/5;ii++)
if(maxim<max[x+j*25+ii*5][y][i][1])
maxim=max[x+j*25+ii*5][y][i][1];
for(j=ii*5+j*25;j<z;j++)
if(maxim<max[x+j][y][i][0])
maxim=max[x+j][y][i][0];
/*for(j=x;j<x+z;j++)
if(maxim<max[j][y][i][0])
maxim=max[j][y][i][0]; */
y+=(1<<i);
}
return maxim;
}
int main()
{freopen("plantatie.in","r",stdin);
int long i,j,x,y,z,m;
scanf("%ld%ld",&n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%ld",&max[i][j][0][0]);
init_max();
freopen("plantatie.out","w",stdout);
for(i=1;i<=m;i++)
{scanf("%ld%ld%ld",&x,&y,&z);
printf("%ld\n",rezolva(x,y,z,z));
}
fclose(stdout);
return 0;
}