Pagini recente » Cod sursa (job #1957948) | Cod sursa (job #944033) | Cod sursa (job #2216052) | Cod sursa (job #2852566) | Cod sursa (job #2629525)
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1005;
deque<int> mn, mx;
int harta[MAXN][MAXN], mini[MAXN][MAXN], maxi[MAXN][MAXN];
int n, m, mind, cnt;
void find_best(int dx, int dy){
for(int i = 1; i <= n; ++i){
mx.clear(); mn.clear();
for(int j = 1; j <= m; ++j){
while(!mn.empty() && harta[i][mn.back()] >= harta[i][j]) mn.pop_back();
while(!mx.empty() && harta[i][mx.back()] <= harta[i][j]) mx.pop_back();
if(!mn.empty() && j - mn.front() + 1 > dy) mn.pop_front();
if(!mx.empty() && j - mx.front() + 1 > dy) mx.pop_front();
mn.push_back(j);
mx.push_back(j);
mini[i][j] = harta[i][mn.front()];
maxi[i][j] = harta[i][mx.front()];
}
}
for(int j = dy; j <= m; ++j){
mx.clear(); mn.clear();
for(int i = 1; i <= n; ++i){
while(!mn.empty() && mini[mn.back()][j] >= mini[i][j]) mn.pop_back();
while(!mx.empty() && maxi[mx.back()][j] <= maxi[i][j]) mx.pop_back();
if(!mn.empty() && i - mn.front() + 1 > dx) mn.pop_front();
if(!mx.empty() && i - mx.front() + 1 > dx) mx.pop_front();
mn.push_back(i);
mx.push_back(i);
if(i >= dx){
int dif = maxi[mx.front()][j] - mini[mn.front()][j];
if(dif == mind) cnt++;
else if(dif < mind){
mind = dif;
cnt = 1;
}
}
}
}
}
int main()
{
ifstream fin("struti.in");
ofstream fout("struti.out");
int p;
fin >> n >> m >> p;
for(int i = 1; i <= n; ++i){
for(int j = 1; j <= m; ++j)
fin >> harta[i][j];
}
while(p--){
int dx, dy;
mind = 1e9; cnt = 1;
fin >> dx >> dy;
find_best(dx, dy);
if(dx != dy) find_best(dy, dx);
fout << mind << " " << cnt << "\n";
}
return 0;
}