Cod sursa(job #215949)

Utilizator mika17Mihai Alex Ionescu mika17 Data 21 octombrie 2008 20:22:48
Problema Plantatie Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#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",maxx);
 }
}

int main()
{
 read();
 proc();
 query();
 return 0;
}