Pagini recente » Cod sursa (job #126447) | Cod sursa (job #2632846) | Cod sursa (job #2751072) | Cod sursa (job #1373852) | Cod sursa (job #2052833)
#include <fstream>
#include <deque>
using namespace std;
ifstream cin("struti.in");
ofstream cout("struti.out");
const int N_MAX = 1000;
const int M_MAX = 1000;
const int INF = 1e9;
int n, m, q;
int sol;
int dx, dy;
pair <int, int> a, b;
deque <pair <int, int> > dq,deq;
int v[1 + N_MAX][1 + M_MAX];
int solmin[1 + N_MAX][1 + M_MAX];
int solmax[1 + N_MAX][1 + M_MAX];
pair <int, int> CalcMinim(int dx, int dy)
{
int sol = INF, ap;
for(int i = 1; i <= n; i++)
{
dq.clear(); deq.clear();
for(int j = 1; j <= m; j++)
{
while(dq.empty() == 0 && dq.back().first >= v[i][j])
dq.pop_back();
dq.push_back({v[i][j], j});
if(dq.front().second <= (j - dx))
dq.pop_front();
while(deq.empty() == 0 && deq.back().first <= v[i][j])
deq.pop_back();
deq.push_back({v[i][j], j});
if(deq.front().second <= (j - dx))
deq.pop_front();
if(j < dx)
{
solmin[i][j] = INF;
solmax[i][j] = -INF;
}
else
{
solmin[i][j] = dq.front().first;
solmax[i][j] = deq.front().first;
}
}
}
for(int j = dx; j <= m; j++)
{
dq.clear(); deq.clear();
for(int i = 1; i <= n; i++)
{
while(dq.empty() == 0 && dq.back().first >= solmin[i][j])
dq.pop_back();
dq.push_back({solmin[i][j], i});
if(dq.front().second <= (i - dy))
dq.pop_front();
while(deq.empty() == 0 && deq.back().first <= solmax[i][j])
deq.pop_back();
deq.push_back({solmax[i][j], i});
if(deq.front().second <= (i - dy))
deq.pop_front();
if(i >= dy)
{
if(deq.front().first - dq.front().first < sol)
{
sol = deq.front().first - dq.front().first;
ap = 1;
}
else if(deq.front().first - dq.front().first == sol)
ap++;
}
}
}
return {sol, ap};
}
int main()
{
cin >> n >> m >> q;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
cin >> v[i][j];
for(; q; q--)
{
cin >> dx >> dy;
a = CalcMinim(dx, dy);
b = CalcMinim(dy, dx);
if(a.first > b.first)
swap(a, b);
if(a.first == b.first && dx != dy)
a.second += b.second;
cout << a.first << " " << a.second << "\n";
}
return 0;
}