Pagini recente » Cod sursa (job #1393787) | Cod sursa (job #2394405) | Cod sursa (job #2506691) | Cod sursa (job #1895906) | Cod sursa (job #778312)
Cod sursa(job #778312)
#include<stdio.h>
FILE *f = fopen("struti.in","r");
FILE *g = fopen("struti.out","w");
#define MaxN 1010
#define MaxDeque 1000100
int N,M,P,Sol,Nr,Sol2,Nr2;
int A[MaxN][MaxN],BMin[MaxN][MaxN],BMax[MaxN][MaxN];
int DequeM[MaxDeque],Dequem[MaxDeque],Pm[MaxDeque],PM[MaxDeque];
void citire(void)
{
fscanf(f,"%d %d %d\n",&N,&M,&P);
for(int i=1;i<=N;i++)
for(int j=1;j<=M;j++)
fscanf(f,"%d ",&A[i][j]);
}
inline void CreareMatriceMinim(int x)
{
int Front,Back;
for(int i=1;i<=M;i++)
{
Front = 1; Back = 0;
for(int j=1;j<=N;j++)
{
for(;Back >= Front && Dequem[Back] >= A[j][i];--Back);
Dequem[++Back] = A[j][i]; Pm[Back] = j;
if(j-Pm[Front] >= x)
++ Front;
if(j >= x)
BMin[j][i] = Dequem[Front];
}
}
}
inline void CreareMatriceMaxim(int x)
{
int Front,Back;
for(int i=1;i<=M;i++)
{
Front = 1; Back = 0;
for(int j=1;j<=N;j++)
{
for(;Back >= Front && DequeM[Back] <= A[j][i];--Back);
DequeM[++Back] = A[j][i]; PM[Back] = j;
if(j-PM[Front] >= x)
++ Front;
if(j >= x)
BMax[j][i] = DequeM[Front];
}
}
}
inline void Dinamica(int x,int y)
{
int FrontMin,BackMin,FrontMax,BackMax;
CreareMatriceMinim(x);
CreareMatriceMaxim(x);
Sol2 = MaxDeque;
for(int i=x;i<=N;i++)
{
FrontMin = FrontMax = 1; BackMin = BackMax = 0;
for(int j=1;j<=M;j++)
{
for(;BackMin >= FrontMin && Dequem[BackMin] >= BMin[i][j];--BackMin);
Dequem[++BackMin] = BMin[i][j]; Pm[BackMin] = j;
if(j-Pm[FrontMin] >= y)
++ FrontMin;
for(;BackMax >= FrontMax && DequeM[BackMax] <= BMax[i][j];--BackMax);
DequeM[++BackMax] = BMax[i][j]; PM[BackMax] = j;
if(j-PM[FrontMax] >= y)
++ FrontMax;
if(j >= y)
if(Sol2 > DequeM[FrontMax]-Dequem[FrontMin])
Sol2 = DequeM[FrontMax]-Dequem[FrontMin], Nr2 = 1;
else if(Sol2 == DequeM[FrontMax]-Dequem[FrontMin])
Nr2 ++;
}
}
}
void Rezolvare(void)
{
int a,b;
for(int i=1;i<=P;i++)
{
fscanf(f,"%d %d",&a,&b);
Dinamica(a,b);
Sol = Sol2; Nr = Nr2;
if(a != b)
{
Dinamica(b,a);
if(Sol > Sol2)
Sol = Sol2, Nr = Nr2;
else if(Sol == Sol2)
Nr += Nr2;
}
fprintf(g,"%d %d\n",Sol,Nr);
}
}
int main()
{
citire();
Rezolvare();
}