Pagini recente » Cod sursa (job #1587716) | Cod sursa (job #2014981) | Cod sursa (job #1322259) | Cod sursa (job #922479) | Cod sursa (job #179196)
Cod sursa(job #179196)
// test run without inline.... hmm this should be slower... or should it?!
#include <stdio.h>
#include <string.h>
#define MAXS 10000
#define MAXN 512
#define MAX2 16
int v[MAXN][MAXN],n,m;
int A[MAXN][MAXN][MAX2];
int p2[MAX2];
int lg2[MAXN];
int maxim(int a, int b)
{
if (a<b) return b;
return a;
}
void citire()
{
char c[MAXS]; int i,j,l,t;
fgets(c,MAXS,stdin);
i=n=m=0;
while (c[i]>='0' && c[i]<='9')
n=n*10+c[i++]-'0';
i++;
while (c[i]>='0' && c[i]<='9')
m=m*10+c[i++]-'0';
for (i=1; i<=n; ++i)
{
fgets(c,MAXS,stdin);
for (j=1,l=0; j<=n; ++j,++l)
{
t=0;
while (c[l]>='0' && c[l]<='9')
t=t*10+c[l++]-'0';
v[i][j]=t;
}
}
}
void make2()
{
int i,j;
for (i=1,p2[0]=1; i<MAX2; ++i)
p2[i]=p2[i-1]<<1;
for (i=1,j=0; i<=n; ++i)
if (p2[j+1]>i)
lg2[i]=j;
else
lg2[i]=++j;
}
void makea()
{
int i,j,k,t;
for (i=n; i>0; --i)
for (j=n; j>0; --j)
{
A[i][j][0]=v[i][j];
for (k=1; i+p2[k]<=n+1 && j + p2[k]<=n+1; ++k)
{
t=A[i][j][k-1];
t=maxim(t,A[ i+p2[k-1] ][ j+p2[k-1] ][ k-1 ]);
t=maxim(t,A[ i+p2[k-1] ][ j ][ k-1 ]);
t=maxim(t,A[ i ][ j+p2[k-1] ][ k-1 ]);
A[i][j][k]=t;
}
}
}
void rezolva()
{
char c[MAXS]; int i,j,x,y,L,t,l;
for (i=0; i<m; ++i)
{
fgets(c,MAXS,stdin);
j=t=x=y=L=0;
while (c[j]>='0' && c[j]<='9')
x=x*10+c[j++]-'0';
j++;
while (c[j]>='0' && c[j]<='9')
y=y*10+c[j++]-'0';
j++;
while (c[j]>='0' && c[j]<='9')
L=L*10+c[j++]-'0';
l=lg2[L];
t=A[x][y][l];
t=maxim(t,A[ x+L-p2[l] ][ y ] [ l ]);
t=maxim(t,A[ x ][ y+L-p2[l] ] [ l ]);
t=maxim(t,A[ x+L-p2[l] ][ y+L-p2[l] ] [ l ]);
printf("%d\n",t);
}
}
int main()
{
freopen("plantatie.in","r",stdin);
freopen("plantatie.out","w",stdout);
citire();
make2();
makea();
rezolva();
fclose(stdin);
fclose(stdout);
return 0;
}