Pagini recente » Cod sursa (job #2369313) | Cod sursa (job #2503181) | Cod sursa (job #2225700) | Cod sursa (job #1555352) | Cod sursa (job #259942)
Cod sursa(job #259942)
#include<stdio.h>
#include<deque>
#define NMAX 1024
#define MOD 666013
using namespace std;
int N,M,T,A1,B,L,ANS,cnt;
int A[NMAX][NMAX],M1[NMAX][NMAX],M2[NMAX][NMAX];
char sir[ 10000 ];
int i1,s1,i2,s2;
void reading()
{
int i,j;
scanf("%d%d%d\n",&N,&M,&T);
int aux,it;
for(i=1; i<=N; ++i)
{
fgets( sir, sizeof( sir ), stdin );
aux=0;j=1;
for(it=0; sir[ it ]!='\n' && sir[ it ]!=NULL; ++it )
{
if( sir[ it ]==' ' )
{
A[i][j]=aux; ++j; aux=0;
}
else
{
aux*=10;
aux+=sir[it]-'0';
}
}
A[i][j]=aux;
}
}
struct smen{
int i1,i2;
};
void solve()
{
int i,j;
deque< smen >D1;
deque< smen >D2;
int aux;
for( j = 1; j <= M; ++j)
{
D1.clear();
D2.clear();
for( i = 1; i <= N; ++i)
{
while(!D1.empty() && D1.back().i1 <= A[i][j]) D1.pop_back();
while(!D2.empty() && D2.back().i1 >= A[i][j]) D2.pop_back();
while(!D1.empty() && D1.front().i2 <= i - A1) D1.pop_front();
while(!D2.empty() && D2.front().i2 <= i - A1) D2.pop_front();
smen X; X.i1 = A[i][j], X.i2 = i;
D1.push_back(X);
D2.push_back(X);
if(i >= A1)
M1[i][j] = D1.front().i1,
M2[i][j] = D2.front().i1;
}
}
for( i = A1; i <= N; ++i)
{
D1.clear();
D2.clear();
for( j = 1; j <= M; ++j)
{
while(!D1.empty() && D1.back().i1 <= M1[i][j]) D1.pop_back();
while(!D2.empty() && D2.back().i1 >= M2[i][j]) D2.pop_back();
while(!D1.empty() && D1.front().i2 <= j - B) D1.pop_front();
while(!D2.empty() && D2.front().i2 <= j - B) D2.pop_front();
smen X1; X1.i1 = M1[i][j], X1.i2 = j;
smen X2; X2.i1 = M2[i][j], X2.i2 = j;
D1.push_back(X1);
D2.push_back(X2);
if(j >= B)
{
aux=D1.front().i1-D2.front().i1;
if( ANS>aux )
{
ANS=aux;
cnt=1;
}
else
if( ANS==aux )
++cnt;
}
}
}
}
int main()
{
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
reading();
while( T-- )
{
scanf("%d%d\n",&A1,&B);
ANS=0x3f3f3f3f;cnt=0;
solve();
if( A1!=B )
{
A1^=B;B^=A1;A1^=B;
solve();
}
printf("%d %d\n",ANS,cnt);
}
return 0;
}