Cod sursa(job #21057)

Utilizator devilkindSavin Tiberiu devilkind Data 22 februarie 2007 21:02:10
Problema Plantatie Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <stdio.h>
#include <string.h>
#define NMAX 512
#define KMAX 8
#define SMAX 5002

FILE *f = fopen("plantatie.in","rt"), *g = fopen("plantatie.out","wt");

long int a[NMAX][NMAX],i,j,k,n,m[NMAX][NMAX][KMAX],l,lmax,x,y,nr;

long int MINN(long int a, long int b)
{
if (a<b) return a;
return b;
}

long int MAXX(long int a, long int b)
{
if (a>b) return a;
return b;
}

void citire()
{
char c[SMAX];

fscanf(f,"%ld %ld\n",&n,&nr);

for (i=1;i<=n;i++)
        for (j=1;j<=n;j++)
            fscanf(f,"%ld",&a[i][j]);
}

long int query(long int x, long int y, long int l)
{
long int k,i,j,rez,sh;
i=x;j=y;
k=1;
while ( (1 << k) <= l)
      k++;
k--;
rez=m[i][j][k];
sh=l- (1 << k);
rez=MAXX(m[i+sh][j][k],rez);
rez=MAXX(m[i][j+sh][k],rez);
rez=MAXX(m[i+sh][j+sh][k],rez);
return rez;
}

void build()
{
for (i=n;i>=1;i--)
    for (j=n;j>=1;j--)
        {
	m[i][j][0]=a[i][j];
	k=1;
	lmax=MINN(n-i+1,n-j+1);
        while ( (1 << k) <=lmax)
              {
              l=1 << k;
              x=query(i+1,j,l-1);
              y=query(i,j+1,l-1);
              x=MAXX(x,y);
              x=MAXX(x,a[i][j]);
              x=MAXX(x,a[i+l-1][j+l-1]);
              m[i][j][k]=x;
              k++;
              }     
        }   
}

int main()
{
long int cnt,sol,x,y,l;
citire();
build();
for (cnt=1;cnt<=nr;cnt++)
    {
    fscanf(f,"%ld %ld %ld",&x,&y,&l);
    sol=query(x,y,l);
    fprintf(g,"%ld\n",sol);
    }
fclose(f);
fclose(g);
return 0;
}