Pagini recente » Cod sursa (job #3030967) | Cod sursa (job #2954837) | Istoria paginii runda/test_pozitiv | Cod sursa (job #2753333) | Cod sursa (job #2269613)
#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 verify(int mat[MAX][MAX]){
for(int i=1;i<=M;++i){
for(int j=1;j<=N;++j) cout<<mat[i][j]<<" ";
cout<<"\n";
}
cout<<"____________\n";
}
void plsWork(int row, int col) {
zero();
makeMinRow(col);
//verify(minRow);
makeMaxRow(col);
//verify(maxRow);
makeMinMat(row,col);
//verify(minMatrix);
makeMaxMat(row,col);
//verify(maxMatrix);
//verify(minMatrix);
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;
}
}
}
//cout<<"NOU!!!\n\n\n";
}
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;
}