Pagini recente » Monitorul de evaluare | Cod sursa (job #2033419) | Cod sursa (job #284643) | Cod sursa (job #1466444) | Cod sursa (job #534757)
Cod sursa(job #534757)
#include<cstdio>
#include<cmath>
#include<fstream>
using namespace std;
int logn,n,q,p2[20],dmax[505][505][20];
ifstream f("plantatie.in");
void read()
{
freopen("plantatie.out","w",stdout);
f>>n>>q;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
f>>dmax[i][j][0];
}
void init()
{
logn=log2(n);
p2[0]=1;
for(int i=1;i<=logn;i++)
p2[i]=p2[i-1]<<1;
}
inline int max(int x,int y)
{
return x>y?x:y;
}
void dinam()
{
for(int k=1;k<=logn;k++)
for(int i=1;i+p2[k]-1<=n;i++)
for(int j=1;j+p2[k]-1<=n;j++)
dmax[i][j][k]=max(dmax[i][j][k-1],max(dmax[i+p2[k-1]][j][k-1],max(dmax[i][j+p2[k-1]][k-1],dmax[i+p2[k-1]][j+p2[k-1]][k-1])));
}
int cautb(int val)
{
int i=0,pas=1<<4;
for(i=0;pas;pas>>=1)
if(i+pas<=logn && p2[i+pas]<=val)
i+=pas;
return i;
}
int rmq(int ii,int ij,int lung)
{
int p=cautb(lung),fi=ii+lung-1,fj=ij+lung-1;
return max(dmax[ii][ij][p],max(dmax[fi-p2[p]+1][ij][p],max(dmax[ii][fj-p2[p]+1][p],dmax[fi-p2[p]+1][fj-p2[p]+1][p])));
}
int main()
{
int x,y,l;
read();
init();
dinam();
for(int i=1;i<=q;i++)
{
f>>x>>y>>l;
printf("%d\n",rmq(x,y,l));
}
return 0;
}