Pagini recente » Cod sursa (job #1830309) | Cod sursa (job #301647) | Cod sursa (job #2902930) | Cod sursa (job #2986734) | Cod sursa (job #3136653)
#include <bits/stdc++.h>
using namespace std;
const int MAX_M = 1000;
const int MAX_N = 1000;
int n, m, p;
int a[MAX_N + 1][MAX_M + 1];
deque <int> minColumn[MAX_M + 1], maxColumn[MAX_M + 1];
deque <int> minArea, maxArea;
int query(int x, int y, int &cnt)
{
int ans = INT_MAX;
cnt = 0;
for(int j = 1; j <= m; j ++)
maxColumn[j].clear(), minColumn[j].clear();
minArea.clear();
maxArea.clear();
for(int i = 1; i <= n; i ++)
{
minArea.clear();
maxArea.clear();
for(int j = 1; j <= m; j ++)
{
if(!minColumn[j].empty() && i > x && a[i - x][j] == minColumn[j].front())
minColumn[j].pop_front();
while(!minColumn[j].empty() && minColumn[j].back() > a[i][j])
minColumn[j].pop_back();
minColumn[j].push_back(a[i][j]);
if(!maxColumn[j].empty() && i > x && a[i - x][j] == maxColumn[j].front())
maxColumn[j].pop_front();
while(!maxColumn[j].empty() && maxColumn[j].back() < a[i][j])
maxColumn[j].pop_back();
maxColumn[j].push_back(a[i][j]);
if(!minArea.empty() && j > y && minColumn[j - y].front() == minArea.front())
minArea.pop_front();
while(!minArea.empty() && minArea.back() > minColumn[j].front())
minArea.pop_back();
minArea.push_back(minColumn[j].front());
if(!maxArea.empty() && j > y && maxColumn[j - y].front() == maxArea.front())
maxArea.pop_front();
while(!maxArea.empty() && maxArea.back() < maxColumn[j].front())
maxArea.pop_back();
maxArea.push_back(maxColumn[j].front());
if(i >= x && j >= y)
{
if(maxArea.front() - minArea.front() < ans)
{
ans = maxArea.front() - minArea.front();
cnt = 1;
}
else if(maxArea.front() - minArea.front() == ans)
cnt ++;
}
}
}
return ans;
}
int main()
{
ios_base :: sync_with_stdio(0);
cin.tie(0);
freopen("struti.in", "r", stdin);
freopen("struti.out", "w", stdout);
cin >> n >> m >> p;
for(int i = 1; i <= n; i ++)
{
for(int j = 1; j <= m; j ++)
cin >> a[i][j];
}
for(int i = 1; i <= p; i ++)
{
int a, b, cnt1, cnt2;
cin >> a >> b;
if(a != b)
{
int x = query(a, b, cnt1);
int y = query(b, a, cnt2);
if(x == y)
cout << x << " " << cnt1 + cnt2 << "\n";
else if(x < y)
cout << x << " " << cnt1 << "\n";
else
cout << y << " " << cnt2 << "\n";
}
else
cout << query(a, b, cnt1) << " " << cnt1 << "\n";
}
return 0;
}