Pagini recente » Cod sursa (job #1078270) | Cod sursa (job #2463108) | Cod sursa (job #2184599) | Cod sursa (job #1688811) | Cod sursa (job #215962)
Cod sursa(job #215962)
#include <stdio.h>
#define NMAX 501
#define LOGMAX 8
#define max(a,b) (a) > (b) ? (a) : (b)
int Q[NMAX][NMAX][LOGMAX + 1],log2[LOGMAX + 1],N,M;
void read()
{
freopen("plantatie.in","r",stdin);
scanf("%d%d",&N,&M);
for(int i = 1; i <= N; ++i)
for(int j = 1; j <= N ; ++j)
scanf("%d",&Q[i][j][0]);
}
void proc() //RMQ 2D O(N^2 log2N)
{
for(int i = 2; i <= N; ++i)
log2[i] = log2[i >> 1] + 1;
for(int k = 1; 1<<k <= N; ++k)
for(int i = 1; i <= N; ++i)
for(int j = 1, e1 = (i + (1<<(k-1)) <= N), e2 = (j + (1<<(k-1)) <= N); j <= N; ++j) {
Q[i][j][k] = Q[i][j][k - 1];
if(e1) Q[i][j][k] = max(Q[i][j][k],Q[i + (1<<(k-1))][j][k - 1]);
if(e2) Q[i][j][k] = max(Q[i][j][k],Q[i][j + (1<<(k-1))][k - 1]);
if(e1 && e2) Q[i][j][k] = max(Q[i][j][k],Q[i + (1<<(k-1))][j + (1<<(k-1))][k - 1]);
}
}
void query()
{
int i,j,k;
freopen("plantatie.out","w",stdout);
int maxx,dif;
while(M--) {
scanf("%d%d%d",&i,&j,&k);
dif = k - ( 1<<log2[k] );
maxx = max( max(Q[i][j][log2[k]],Q[i][j + dif][log2[k]]) ,
max(Q[i + dif][j][log2[k]],Q[i + dif][j +dif][log2[k]]) ) ;
printf("%d\n",max(1,maxx) );
}
}
int main()
{
read();
proc();
query();
return 0;
}