Pagini recente » Cod sursa (job #1855176) | Cod sursa (job #2991024) | Cod sursa (job #1970068) | Cod sursa (job #2147047) | Cod sursa (job #2040506)
#include <iostream>
#include <cstdio>
#include <deque>
#define NMAX 1005
#define MAX 0x3f3f3f
using namespace std;
int M, N, nrOferte, teren[NMAX][NMAX], dx, dy;
deque <int> qMin, qMax;
int matMin[NMAX][NMAX], matMax[NMAX][NMAX];
struct solutie
{
int nr, minim;
} rezultat;
void readMatrix()
{
scanf("%d%d%d", &M, &N, &nrOferte);
for(int i=1; i<=M; ++i)
for(int j=1; j<=N; ++j)
scanf("%d", &teren[i][j]);
}
void solve()
{
for(int nrVerif = 1; nrVerif <= 2; ++nrVerif)
{
for(int i=1; i<=M; ++i)
{
///deque pe dy
for(int j=1; j<=N; ++j)
{
if(!qMin.empty() && j-qMin.front() >= dy)
qMin.pop_front();
if(!qMax.empty() && j-qMax.front() >= dy)
qMax.pop_front();
while(!qMin.empty() && teren[i][j] <= teren[i][qMin.back()])
qMin.pop_back();
while(!qMax.empty() && teren[i][j] >= teren[i][qMax.back()])
qMax.pop_back();
qMin.push_back(j);
qMax.push_back(j);
///adaugare in matrice de Max si Min
matMin[i][j] = teren[i][qMin.front()];
matMax[i][j] = teren[i][qMax.front()];
}
///resetare deque-uri
while(!qMin.empty())
qMin.pop_back();
while(!qMax.empty())
qMax.pop_back();
}
for(int j = dy; j <= N; ++j)
{
for(int i = 1; i <= M; ++i)
{
if(!qMin.empty() && i-qMin.front() >= dx)
qMin.pop_front();
if(!qMax.empty() && i-qMax.front() >= dx)
qMax.pop_front();
while(!qMin.empty() && matMin[i][j] <= matMin[qMin.back()][j])
qMin.pop_back();
while(!qMax.empty() && matMax[i][j] >= matMax[qMax.back()][j])
qMax.pop_back();
qMin.push_back(i);
qMax.push_back(i);
if(i >= dx)
{
if(matMax[qMax.front()][j] - matMin[qMin.front()][j] < rezultat.minim)
{
rezultat.minim = matMax[qMax.front()][j] - matMin[qMin.front()][j];
rezultat.nr = 1;
}
else if(matMax[qMax.front()][j] - matMin[qMin.front()][j] == rezultat.minim)
{
rezultat.nr++;
}
}
}
while(!qMin.empty())
qMin.pop_back();
while(!qMax.empty())
qMax.pop_back();
}
if(dx != dy)
swap(dx, dy);
else
nrVerif = 8;
}
}
int main()
{
freopen("struti.in", "r", stdin);
freopen("struti.out", "w", stdout);
readMatrix();
for(int i=1; i<=nrOferte; ++i)
{
scanf("%d%d", &dx, &dy);
rezultat.nr = 0;
rezultat.minim = 1000000;
solve();
printf("%d %d\n", rezultat.minim, rezultat.nr);
}
return 0;
}