Pagini recente » Cod sursa (job #1158219) | Cod sursa (job #1409908) | Cod sursa (job #543799) | Cod sursa (job #2858835) | Cod sursa (job #423488)
Cod sursa(job #423488)
#include<iostream>
#include<string>
using namespace std;
#define NM 505
#define KM 10
int N,Q;
int A[NM][NM], RMQ[NM][NM][KM], LG[NM];
int main()
{
int p2[KM],a,b,k;
freopen("plantatie.in","r",stdin);
freopen("plantatie.out","w",stdout);
p2[0]=1;
for(int i=1;i<KM;++i)
p2[i]=p2[i-1]*2;
scanf("%d %d",&N,&Q);
for(int i=1;i<=N;++i)
for(int j=1;j<=N;++j)
scanf("%d",&A[i][j]);
for(int i=1;i<=N;++i)
for(int j=1;j<=N;++j)
RMQ[i][j][0]=A[i][j];
for(int p=1;p<KM;++p)
for(int i=1;i<=N;++i)
{
if(i+p2[p]-1>N) break;
for(int j=1;j<=N;++j)
{
if(j+p2[p]-1>N) break;
int b1=RMQ[i][j][p-1];
int b2=RMQ[i][j+p2[p-1]][p-1];
int b3=RMQ[i+p2[p-1]][j][p-1];
int b4=RMQ[i+p2[p-1]][j+p2[p-1]][p-1];
b1=max(b1,b2);
b3=max(b3,b4);
RMQ[i][j][p]=max(b1,b3);
}
}
int ind=1, p=0;
while(ind <= N)
{
int q=p2[p];
while(ind <= N && q)
{
LG[ind]=p;
++ind;
--q;
}
++p;
}
while(Q--)
{
scanf("%d %d %d",&a,&b,&k);
int pmax=LG[k];
int b1=RMQ[a][b][pmax];
int b2=RMQ[a][b+k-p2[pmax]][pmax];
int b3=RMQ[a+k-p2[pmax]][b][pmax];
int b4=RMQ[a+k-p2[pmax]][b+k-p2[pmax]][pmax];
b1=max(b1,b2);
b3=max(b3,b4);
int ans=max(b1,b3);
printf("%d\n",ans);
}
return 0;
}