Pagini recente » Cod sursa (job #347933) | Cod sursa (job #1399166)
#include <fstream>
#include <deque>
#include <algorithm>
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
int N, M, P, DX, DY;
int sol, nrsol;
int A[1005][1005];
int minim[1005][1005], maxim[1005][1005];
deque<int> DQmin, DQmax;
void solve(int R, int C)
{
for (int i = 1; i <= N; ++i)
{
while (!DQmin.empty())
DQmin.pop_back();
while (!DQmax.empty())
DQmax.pop_back();
for (int j = 1; j <= M; ++j)
{
while (!DQmin.empty() && A[i][j] <= A[i][DQmin.back()])
DQmin.pop_back();
DQmin.push_back(j);
while (DQmin.front() <= j - C)
DQmin.pop_front();
if (j >= C)
minim[i][j] = A[i][DQmin.front()];
while (!DQmax.empty() && A[i][j] >= A[i][DQmax.back()])
DQmax.pop_back();
DQmax.push_back(j);
while (DQmax.front() <= j - C)
DQmax.pop_front();
if (j >= C)
maxim[i][j] = A[i][DQmax.front()];
}
}
for (int j = 1; j <= M; ++j)
{
while (!DQmin.empty())
DQmin.pop_back();
while (!DQmax.empty())
DQmax.pop_back();
for (int i = 1; i <= N; ++i)
{
while (!DQmin.empty() && minim[i][j] <= minim[DQmin.back()][j])
DQmin.pop_back();
DQmin.push_back(i);
while (DQmin.front() <= i - R)
DQmin.pop_front();
while (!DQmax.empty() && maxim[i][j] >= maxim[DQmax.back()][j])
DQmax.pop_back();
DQmax.push_back(i);
while (DQmax.front() <= i - R)
DQmax.pop_front();
if (i >= R && j >= C)
{
int dif = maxim[DQmax.front()][j] - minim[DQmin.front()][j];
if (dif < sol)
{
sol = dif;
nrsol = 1;
}
else if (dif == sol)
++nrsol;
}
}
}
}
int main()
{
fin >> N >> M >> P;
for (int i = 1; i <= N; ++i)
for (int j = 1; j <= M; ++j)
fin >> A[i][j];
while (P--)
{
fin >> DX >> DY;
sol = 8001, nrsol = 0;
solve(DX, DY);
if (DX != DY)
solve(DY, DX);
fout << sol << ' ' << nrsol << '\n';
}
fin.close();
fout.close();
return 0;
}