Pagini recente » Cod sursa (job #478571) | Cod sursa (job #48318) | Cod sursa (job #2887518) | Cod sursa (job #2102822) | Cod sursa (job #534118)
Cod sursa(job #534118)
#include<stdio.h>
#define Nmax 510
int Rmq[12][Nmax][Nmax], a[Nmax][Nmax], Lg[Nmax] ;
int i,j,n,m,x,y,k;
void RMQ ()
{
int i,j,k,K,A,B,C,D;
Lg[1] = 0 ;
for( i = 2 ; i <= n ; i++ )
Lg[i] = 1 + Lg[i>>1] ;
K = Lg[n] ;
for( i = 1 ; i <= n ; i++ )
for( j = 1 ; j <= n ; j++ )
Rmq[0][i][j] = a[i][j] ;
for( k = 1 ; k <= K ; k++ )
for( i = 1 ; i + (1<<k) - 1 <= n ; i++ )
for( j = 1 ; j + (1<<k) - 1 <= n ; j++ )
{
A = Rmq[k-1][i][j] ;
B = Rmq[k-1][i+(1<<(k-1))][j];
C = Rmq[k-1][i][j+(1<<(k-1))];
D = Rmq[k-1][i+(1<<(k-1))][j+(1<<(k-1))];
if( A < B ) A = B ;
if( A < C ) A = C ;
if( A < D ) A = D ;
Rmq[k][i][j] = A ;
}
}
int query( int x, int y, int K )
{
int k = Lg[K], A, B, C, D ;
A = Rmq[k][x][y] ;
B = Rmq[k][x+K-(1<<k)][y];
C = Rmq[k][x][y+K-(1<<k)];
D = Rmq[k][x+K-(1<<k)][y+K-(1<<k)];
if( A < B ) A = B ;
if( A < C ) A = C ;
if( A < D ) A = D ;
return A ;
}
int main()
{
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[i][j]);
RMQ();
for( i = 1 ; i <= m ; i++ )
{
scanf("%d %d %d",&x,&y,&k);
printf("%d\n",query(x,y,k));
}
return 0;
}