Pagini recente » Cod sursa (job #2138931) | Cod sursa (job #156081) | Cod sursa (job #1149957) | Cod sursa (job #348581) | Cod sursa (job #179187)
Cod sursa(job #179187)
#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];
inline int maxim(int a, int b)
{
if (a<b) return b;
return a;
}
inline 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;
}
}
}
inline 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;
}
inline 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;
}
}
}
// ideea cu fputs in loc de printf a fost inspirata din http://infoarena.ro/job_detail/154168
// Leoveanu Mihaita Alexandru.... you kick ass! i mean 432 ms pe RMQ... thats godly!
// ramane de vazut daca am implementat-o mai eficient decat printf.. :D
// (original voiam sa copy paste functia de scriere din prog mentionat mai sus dar se pare ca
// imi crash-uia programul (la mine pe calculator cel putin...)...
void scrie(int x)
{
char s[16]; memset(s,0,sizeof(s));
int cifre[16],t=0,t2=0;memset(cifre,0,sizeof(cifre));
do
{
cifre[t++]=x%10;
x/=10;
} while (x);
t--;
do
{
s[t2++]=cifre[t--]+'0';
} while (t>=0);
s[t2++]='\n';
s[t2++]='\0';
fputs(s,stdout);
}
inline 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 ]);
scrie(t);
}
}
int main()
{
freopen("plantatie.in","r",stdin);
freopen("plantatie.out","w",stdout);
citire();
make2();
makea();
rezolva();
fclose(stdin);
fclose(stdout);
return 0;
}