Cod sursa(job #19817)

Utilizator marius135Dumitran Adrian Marius marius135 Data 20 februarie 2007 00:07:26
Problema Plantatie Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.25 kb
#include<stdio.h>
#include<string.h>
#define maxn 501
#define gal 5

int v[maxn][maxn];
int t[maxn][256];
int x[maxn][256];
int w[maxn][256];

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

}

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


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


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

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

}
int calc1(int a,int b,int c,int d)
{
	int i,j,s=0;
	for(i=a;i<=c;i++)
		for(j=b;j<=d;j++)
			s=max(s,v[i][j]);
	return s;
}
int main()
{
int a,b,c,i,j,n,m,nr;
freopen("plantatie.in","rt",stdin);
freopen("plantatie.out","wt",stdout);



scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
  for(j=1;j<=n;j++)
    scanf("%d",&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++)
    {
	w[i][j]=t[i][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("%d%d%d",&a,&b,&c);
  printf("%d\n",calc(a,b,a+c-1,b+c-1));
  }


return 0;
}