Pagini recente » Cod sursa (job #2847354) | Cod sursa (job #663704) | Cod sursa (job #2514026) | Cod sursa (job #3040901) | Cod sursa (job #261900)
Cod sursa(job #261900)
#include <stdio.h>
#include <stdlib.h>
#define MAXN 1024
struct toxicpie
{
int v,p;
};
int v[MAXN][MAXN];
int T1[MAXN][MAXN];
int T2[MAXN][MAXN];
toxicpie D1[MAXN];
toxicpie D2[MAXN];
int M,N,P,m=0,r=0;
inline void chestie2(int X, int Y)
{
int i,j,L1=0,L2=0,R1=0,R2=0,tt=0;
m=8001; r=0;
for (j=1; j<=M; ++j)
{
L1=L2=1; R1=R2=0;
for (i=1; i<X; ++i)
{
while (L1<=R1 && v[i][j] >= D1[R1].v) --R1;
D1[++R1].p = i; D1[R1].v=v[i][j];
while (L2<=R2 && v[i][j] <= D2[R2].v) --R2;
D2[++R2].p = i; D2[R2].v=v[i][j];
}
for (i=X; i<=N; ++i)
{
while (L1<=R1 && v[i][j] >=D1[R1].v) --R1;
D1[++R1].p = i; D1[R1].v=v[i][j];
while (L2<=R2 && v[i][j] <= D2[R2].v) --R2;
D2[++R2].p = i; D2[R2].v=v[i][j];
if (D1[L1].p==i-X) ++L1;
T1[i][j]=D1[L1].v;
if (D2[L2].p==i-X) ++L2;
T2[i][j]=D2[L2].v;
}
}
for (i=X; i<=N; ++i)
{
L1=L2=1; R1=R2=0;
for (j=1; j<Y; ++j)
{
while (L1 <= R1 && T1[i][j] >= D1[R1].v ) --R1;
D1[++R1].p = j; D1[R1].v = T1[i][j];
while (L2 <= R2 && T2[i][j] <= D2[R2].v ) --R2;
D2[++R2].p = j; D2[R2].v = T2[i][j];
}
for (j=Y; j<=M; ++j)
{
while (L1 <= R1 && T1[i][j] >= D1[R1].v ) --R1;
D1[++R1].p = j; D1[R1].v = T1[i][j];
while (L2 <= R2 && T2[i][j] <= D2[R2].v ) --R2;
D2[++R2].p = j; D2[R2].v = T2[i][j];
if (D1[L1].p==j-Y) ++L1;
if (D2[L2].p==j-Y) ++L2;
T1[i][j]=D1[L1].v;
T2[i][j]=D2[L2].v;
tt=D1[L1].v - D2[L2].v;
if (tt==m) r++;
if (tt<m) {m=tt; r=1;}
}
}
}
void citire()
{
int i,j,m2,r2,X,Y;
char s[MAXN*6];
gets(s); i=0;
while (s[i]>='0' && s[i]<='9')
N=N*10+s[i++]-'0';
while (s[i]<'0' || s[i]>'9')
++i;
while (s[i]>='0' && s[i]<='9')
M=M*10+s[i++]-'0';
while (s[i]<'0' || s[i]>'9')
++i;
while (s[i]>='0' && s[i]<='9')
P=P*10+s[i++]-'0';
if (M>=N)
{
for (i=1; i<=N; ++i)
{
gets(s); X=0;
for (j=1; j<=M; ++j)
{
Y=0;
while (s[X]<'0' || s[X]>'9')
++X;
while (s[X]>='0' && s[X]<='9')
Y=Y*10+s[X++]-'0';
v[i][j]=Y;
}
}
}
else
{
for (i=1; i<=N; ++i)
{
gets(s); X=0;
for (j=1; j<=M; ++j)
{
Y=0;
while (s[X]<'0' || s[X]>'9')
++X;
while (s[X]>='0' && s[X]<='9')
Y=Y*10+s[X++]-'0';
v[j][i]=Y;
}
}
M=M+N; N=M-N; M=M-N;
}
for (j=0; j<P; ++j)
{
i=0; gets(s); X=0; Y=0;
while (s[i]>='0' && s[i]<='9')
X=X*10+s[i++]-'0';
while (s[i]<'0' || s[i]>'9')
++i;
while (s[i]>='0' && s[i]<='9')
Y=Y*10+s[i++]-'0';
chestie2(X,Y); m2=m; r2=r;
if (X!=Y)
{
chestie2(Y,X);
if (m2==m) r2+=r;
if (m2>m) { m2=m; r2=r;}
}
printf("%d %d\n",m2,r2);
}
}
int main()
{
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
citire();
fclose(stdin);
fclose(stdout);
return 0;
}