Pagini recente » Cod sursa (job #1646705) | Cod sursa (job #1648217) | Cod sursa (job #2077608) | Cod sursa (job #1844357) | Cod sursa (job #259957)
Cod sursa(job #259957)
#include <cstdio>
#include <deque>
using namespace std;
#define MAX_N 1005
#define INF 8005
int A[MAX_N][MAX_N], Max[MAX_N][MAX_N], Min[MAX_N][MAX_N];char sir[10000];
int N, M, P;
int Dif, Nr;
/*
struct deck
{
int first, poz;
};*/
void citire()
{
scanf("%d %d %d\n",&N, &M, &P);
int i,j,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;
}
}
void search(int Dx, int Dy)
{
deque < pair<int,int> > Q1, Q2, Q3, Q4;
int i,j;
for(j = 1; j <= M; ++j)
{
Q1.clear();
Q2.clear();
for(i = 1; i <= N; ++i)
{
while(!Q1.empty() && Q1.back().first <= A[i][j]) Q1.pop_back();
while(!Q2.empty() && Q2.back().first >= A[i][j]) Q2.pop_back();
while(!Q1.empty() && Q1.front().second <= i - Dx) Q1.pop_front();
while(!Q2.empty() && Q2.front().second <= i - Dx) Q2.pop_front();
//deck X; X.first = A[i][j], X.second = i;
Q1.push_back(make_pair(A[i][j],i));
Q2.push_back(make_pair(A[i][j],i));
if(i >= Dx)
Max[i][j] = Q1.front().first,
Min[i][j] = Q2.front().first;
}
}
for(i = Dx; i <= N; ++i)
{
Q3.clear();
Q4.clear();
for(j = 1; j <= M; ++j)
{
while(!Q3.empty() && Q3.back().first <= Max[i][j]) Q3.pop_back();
while(!Q4.empty() && Q4.back().first >= Min[i][j]) Q4.pop_back();
while(!Q3.empty() && Q3.front().second <= j - Dy) Q3.pop_front();
while(!Q4.empty() && Q4.front().second <= j - Dy) Q4.pop_front();
//deck X1; X1.first = Max[i][j], X1.second = j;
//deck X2; X2.first = Min[i][j], X2.second = j;
Q3.push_back(make_pair(Max[i][j],j));
Q4.push_back(make_pair(Min[i][j],j));
if(j >= Dy)
if(Q3.front().first - Q4.front().first < Dif)
Dif = Q3.front().first - Q4.front().first,
Nr = 1;
else if(Q3.front().first - Q4.front().first == Dif)
++Nr;
}
}
}
int main()
{
freopen("struti.in","rt",stdin);
freopen("struti.out","wt",stdout);
citire();
while(P--)
{
int x, y;
scanf("%d%d\n",&x, &y);
Dif = INF, Nr = 0;
search(x, y);
if(x != y)
search(y, x);
printf("%d %d\n", Dif, Nr);
}
}