Pagini recente » Cod sursa (job #1937145) | Cod sursa (job #1400539) | Cod sursa (job #1280949) | Clasament Grigore Mosil 2016 Clasa a 10-a | Cod sursa (job #2479949)
#include <bits/stdc++.h>
#define MAX 2000
using namespace std;
ifstream INPUT_FILE("struti.in");
ofstream OUTPUT_FILE("struti.out");
int M, N, P, minDif, minDifCount, matrix[MAX][MAX], minRow[MAX][MAX], maxRow[MAX][MAX], minMatrix[MAX][MAX], maxMatrix[MAX][MAX];
void zero()
{
for (int i = 1; i <= M; ++i) {
for (int j = 1; j <= N; ++j) minRow[i][j] = maxRow[i][j] = minMatrix[i][j] = maxMatrix[i][j];
}
}
void makeMinRow(int col)
{
for (int i = 1; i <= M; ++i) {
deque<int> tmp;
for (int j = 1; j <= N; ++j) {
while (!tmp.empty() && matrix[i][tmp.back()] >= matrix[i][j]) tmp.pop_back();
tmp.push_back(j);
if (tmp.back() - tmp.front() >= col) tmp.pop_front();
if (j >= col) minRow[i][j] = matrix[i][tmp.front()];
}
}
}
void makeMaxRow(int col)
{
for (int i = 1; i <= M; ++i) {
deque<int> tmp;
for (int j = 1; j <= N; ++j) {
while (!tmp.empty() && matrix[i][tmp.back()] <= matrix[i][j]) tmp.pop_back();
tmp.push_back(j);
if (tmp.back() - tmp.front() >= col) tmp.pop_front();
if (j >= col) maxRow[i][j] = matrix[i][tmp.front()];
}
}
}
void makeMinMat(int row, int col)
{
for (int j = col; j <= N; ++j) {
deque<int> tmp;
for (int i = 1; i <= M; ++i) {
while (!tmp.empty() && minRow[tmp.back()][j] >= minRow[i][j]) tmp.pop_back();
tmp.push_back(i);
if (tmp.back() - tmp.front() >= row) tmp.pop_front();
if (i >= row) minMatrix[i][j] = minRow[tmp.front()][j];
}
}
}
void makeMaxMat(int row, int col)
{
for (int j = col; j <= N; ++j) {
deque<int> tmp;
for (int i = 1; i <= M; ++i) {
while (!tmp.empty() && maxRow[tmp.back()][j] <= maxRow[i][j]) tmp.pop_back();
tmp.push_back(i);
if (tmp.back() - tmp.front() >= row) tmp.pop_front();
if (i >= row) maxMatrix[i][j] = maxRow[tmp.front()][j];
}
}
}
void plsWork(int row, int col)
{
zero();
makeMinRow(col);
makeMaxRow(col);
makeMaxMat(row, col);
for (int i = row; i <= M; ++i) {
for (int j = col; j <= N; ++j) {
if (maxMatrix[i][j] - minMatrix[i][j] == minDif) minDifCount++;
else if (maxMatrix[i][j] - minMatrix[i][j] < minDif) {
minDif = maxMatrix[i][j] - minMatrix[i][j];
minDifCount = 1;
}
}
}
}
void read()
{
ios_base::sync_with_stdio(false);
INPUT_FILE.tie(NULL);
OUTPUT_FILE.tie(NULL);
INPUT_FILE >> M >> N >> P;
for (int i = 1; i <= M; ++i) {
for (int j = 1; j <= N; ++j) INPUT_FILE >> matrix[i][j];
}
int dx, dy;
for (int i = 1; i <= P; ++i) {
minDif = INT_MAX;
minDifCount = 0;
INPUT_FILE >> dx >> dy;
plsWork(dx, dy);
if (dx != dy) plsWork(dy, dx);
OUTPUT_FILE << minDif << " " << minDifCount << '\n';
}
}
int main()
{
read();
return 0;
}