Cod sursa(job #215965)

Utilizator mika17Mihai Alex Ionescu mika17 Data 21 octombrie 2008 21:09:04
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 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[NMAX],N,M;  //LOLLLLLL unde era eroarea

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 + (1<<k) - 1 <= N; ++i)
   for(int j = 1; j + (1<<k) - 1 <= N ; ++j) {
    Q[i][j][k] = max(Q[i][j][k - 1],Q[i + (1<<(k-1))][j][k - 1]);
    Q[i][j][k] = max(Q[i][j][k],Q[i][j + (1<<(k-1))][k - 1]);
    Q[i][j][k] = max(Q[i][j][k],Q[i + (1<<(k-1))][j + (1<<(k-1))][k - 1]);
   }
}

void query()
{
 freopen("plantatie.out","w",stdout);

 int i,j,k,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;
}