Pagini recente » Cod sursa (job #2576104) | Cod sursa (job #1851959) | Cod sursa (job #3261124) | Cod sursa (job #2248560) | Cod sursa (job #3212125)
#include <iostream>
#include <fstream>
#include <deque>
#include <climits>
#define N_MAX 1005
using namespace std;
ifstream in("struti.in");
ofstream out("struti.out");
short int n, m, mat[N_MAX][N_MAX];
short int maxx[N_MAX][N_MAX], minn[N_MAX][N_MAX], aux[N_MAX][N_MAX];
short int query;
deque <int> dq;
bool cmp (int a, int b, bool order){
if (order == 1)
return a >= b;
return a <= b;
}
void completeMaxxMinn (int x, int y, bool order){ // the variable order dictates which matrix I complete -> maxx or minn;
for (int i=1; i<=n; ++i){
dq.clear();
for (int j=1; j<=m; ++j){
while (!dq.empty() && cmp(mat[i][j], mat[i][dq.back()], order))
dq.pop_back();
dq.push_back(j);
if (j >= y){
aux[i][j] = mat[i][dq.front()];
if (j - dq.front() + 1 == y)
dq.pop_front();
}
}
}
for (int j=y; j<=m; ++j){
dq.clear();
for (int i=1; i<=n; ++i){
while (!dq.empty() && cmp(aux[i][j], aux[dq.back()][j], order))
dq.pop_back();
dq.push_back(i);
if (i >= x){
if (order == 1)
maxx[i][j] = aux[dq.front()][j];
else
minn[i][j] = aux[dq.front()][j];
if (i - dq.front() + 1 == x)
dq.pop_front();
}
}
}
}
pair <int, int> solve (int x, int y){
int rez = INT_MAX;
int cnt = 0;
completeMaxxMinn(x, y, 1);
completeMaxxMinn(x, y, 0);
for (int i=x; i<=n; ++i){
for (int j=y; j<=m; ++j){
int diff = maxx[i][j] - minn[i][j];
if (diff < rez){
rez = diff;
cnt = 1;
}
else if (diff == rez){
cnt++;
}
}
}
return {rez, cnt};
}
int main()
{
int x, y;
in >> n >> m >> query;
for (int i=1; i<=n; ++i)
for (int j=1; j<=m; ++j)
in >> mat[i][j];
pair<int, int> ans1, ans2;
for (int i=1; i<=query; ++i){
in >> x >> y;
ans1 = solve(x, y);
ans2 = solve(y, x);
if (x == y){
out << ans1.first << ' ' << ans1.second;
}
else if (ans1.first < ans2.first){
out << ans1.first << ' ' << ans1.second;
}
else if (ans1.first > ans2.first){
out << ans2.first << ' ' << ans2.second;
}
else{
out << ans1.first << ' ' << ans1.second + ans2.second;
}
out << '\n';
}
return 0;
}