Cod sursa(job #146888)

Utilizator floringh06Florin Ghesu floringh06 Data 2 martie 2008 13:11:27
Problema Plantatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
//Dinamica RMQ 3D   
using namespace std;   
#define nmax 515   
  
#include<stdio.h>   
  
FILE *fin=fopen("plantatie.in","r"),   
     *fout=fopen("plantatie.out","w");   
        
int i,j,n,m,p,k,ii,pw;   
int opt[nmax][nmax][12];        
  
  
int maxim(int a, int b, int c, int d)   
 {   
  int max=-10000;   
  if (a>max) max=a;   
  if (b>max) max=b;   
  if (c>max) max=c;   
  if (d>max) max=d;   
  return max;   
 }   
  
void gosolve()   
 {   
   int pw;   
   pw=1;   
   for (k=1; k<=p; k++)   
    {   
     for (i=1; i<=n; i++)   
      for (j=1; j<=n; j++)   
      if (i+pw<=n && j+pw<=n)    
       opt[i][j][k]=maxim(opt[i][j][k-1],opt[i][j+pw][k-1],opt[i+pw][j][k-1],opt[i+pw][j+pw][k-1]);   
      pw<<=1;   
    }   
 }       
  
        
int main()   
{   
    fscanf(fin,"%d%d",&n,&m);   
    p=1;   
    while ((1<<p)<=n) p++;   
    p--;   
    for (i=1; i<=n; i++)   
     for (j=1; j<=m; j++)   
      fscanf(fin,"%d",&opt[i][j][0]);   
    gosolve();   
    fscanf(fin,"\n");   
    for (ii=1; ii<=m ; ii++)   
     {   
       fscanf(fin,"%d%d%d",&i,&j,&k);   
       pw=1; p=1;   
       while ((1<<p)<=k)    
        { p++; pw<<=1; }   
       p--;   
       fprintf(fout,"%d\n",maxim(opt[i][j][p],opt[i][j+k-pw][p],opt[i+k-pw][j][p],opt[i+k-pw][j+k-pw][p]));    
     }   
  fclose(fin);   
  fclose(fout);   
 return 0;   
}