Cod sursa(job #19514)

Utilizator marius135Dumitran Adrian Marius marius135 Data 19 februarie 2007 18:22:39
Problema Plantatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include<stdio.h>
#include<string.h>
#define maxn 501
#define gal 43

long v[maxn][maxn];
long t[maxn][maxn];
long x[maxn][maxn];

void fa(long *a,long *b,long n)
{
	long i;
	for(i=1;i<=n;i++)
		if(b[(i/gal)+!!(i%gal)]<a[i])
			b[(i/gal)+!!(i%gal)]=a[i];
			

}

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


long cal(long a,long b,long c,long d)
{
	long i,j,s=0;
	for(i=a;i<c;i++)
		for(j=b;j<d;j++)
			s=max(s,x[i][j]);
	return s;
}


long calc(long a,long b,long e,long f)
{
long c,d,s=0,j,y,z,i;

c=a/gal+1;c*=gal;
d=b/gal+1;d*=gal;
y=(e-1)/gal;y*=gal;
z=(f-1)/gal;z*=gal;
for(i=a;i<=c;i++)
  for(j=b;j<f;j++)
    if(v[i][j]>s) s=v[i][j];
for(i=y+1;i<e;i++)
  for(j=b;j<f;j++)
    s=max(s,v[i][j]);
for(i=c+1;i<=y;i++)
	{
	for(j=b;j<=d;j++)
		s=max(s,v[i][j]);
	for(j=z+1;j<f;j++)
		s=max(s,v[i][j]);
	}
return max(s,cal(c/gal,y/gal,d/gal,z/gal));

}
int main()
{
long a,b,c,i,j,n,m,nr;
freopen("plantatie.in","rt",stdin);
freopen("plantatie.out","wt",stdout);



scanf("%ld%ld",&n,&m);
for(i=1;i<=n;i++)
  for(j=1;j<=n;j++)
    scanf("%ld",&v[i][j]);
for(i=1;i<=n;i++)
  fa(v[i],t[i],n);
nr=n/gal;
for(i=1;i<=n;i++)
  for(j=1;j<=nr;j++)
    x[j][i]=t[i][j];
memset(t,0,sizeof(t));
for(i=1;i<=n;i++)
  fa(x[i],t[i],n);
memset(x,0,sizeof(x));
for(i=1;i<=n;i++)
  for(j=1;j<=nr;j++)
    x[j][i]=t[i][j];

for(i=1;i<=m;i++)
  {
  scanf("%ld%ld%ld",&a,&b,&c);
  printf("%ld\n",calc(a,b,a+c,b+c));
  }


return 0;
}