Cod sursa(job #18488)

Utilizator alecmanAchim Ioan Alexandru alecman Data 18 februarie 2007 12:24:55
Problema Plantatie Scor 10
Compilator cpp Status done
Runda preONI 2007, Runda 2, Clasa a 10-a Marime 1.65 kb
/*
 *
 *
  Info-Arena 2.0 - preONI 2007 - Runda 2 - Plantatie
 *
 *
 */

#include<stdio.h>
#include<math.h>

#define INPUT "plantatie.in"
#define OUTPUT "plantatie.out"
#define INFI -2000000000

FILE *fin=fopen(INPUT, "r"),*fout=fopen(OUTPUT, "w");

int n;
long m,a[501][501],b[501][501][3],val;

void citire();
long max(long x, long y);
long calcul(int x, int y, int z);

int main()
{
  citire();
  int linie, coloana, valoare;
  long rez;
  for(long i=1;i<=m;++i)
  {
     fscanf(fin, "%d %d %d", &linie, &coloana, &valoare);
     rez=calcul(linie, coloana, valoare);
     fprintf(fout, "%ld\n", rez);
  }
  fclose(fin);
  fclose(fout);
  return 0;
}

void citire()
{
  fscanf(fin, "%d %ld", &n, &m);
  val=sqrt(n);
  for(int i=1;i<=n;++i)
    for(int j=1;j<=n;++j)
    {
      fscanf(fin, "%ld", &a[i][j]);
      if(j%val==1 || j==1)
        b[i][j][0]=a[i][j];
      else
        b[i][j][0]=max(b[i][j-1][0],a[i][j]);
      if(i%val==1 || i==1)
        b[i][j][1]=b[i][j][0];
      else
        b[i][j][1]=max(b[i-1][j][1],b[i][j][0]);
    }
}

long max(long x, long y)
{
  if(x>y)
    return x;
  return y;
}

long calcul(int x, int y, int z)
{
  long maxim;
  maxim=INFI;
  for(int i=x;i<=x+z-1;++i)
     for(int j=y;j<=y+z-1;)
     {
       while(j%val!=1)
       {
         maxim=max(maxim, b[i][j][0]);
         ++j;
       }
       while(j<=y+z-1)
         if(j+val<=y+z-1)
         {
           maxim=max(maxim, b[i][j+val-1][0]);
           j+=val;
         }
         else
         {
           maxim=max(maxim, b[i][y+z-1][0]);
           j=y+z;
         }
     }
  return maxim;
}