Pagini recente » Istoria paginii runda/forta | Istoria paginii utilizator/anaana123456789 | Cod sursa (job #1399514) | Cod sursa (job #773979) | Cod sursa (job #1729044)
#include <iostream>
#include <fstream>
#include <cstring>
#include <deque>
using namespace std;
ifstream in("struti.in");
ofstream out("struti.out");
const int maxn = 1005;
int minim[maxn][maxn];
int maxim[maxn][maxn];
int M[maxn][maxn];
deque <int> dqmin;
deque <int> dqmax;
int m, n;
pair <int, int> solve(int lin, int col)
{
memset(minim, 0, sizeof minim);
memset(maxim, 0, sizeof maxim);
for(int p = 1; p <= m; p++)
{
dqmin.clear();
dqmax.clear();
int k = col;
for(int i = 1; i < k; i++)
{
while(!dqmin.empty() && M[p][dqmin.back()] >= M[p][i])
dqmin.pop_back();
dqmin.push_back(i);
}
for(int i = k; i <= n; i++)
{
while(!dqmin.empty() && M[p][dqmin.back()] >= M[p][i])
dqmin.pop_back();
dqmin.push_back(i);
if(dqmin.front() <= i - k)
dqmin.pop_front();
minim[p][i - k + 1] = M[p][dqmin.front()];
}
for(int i = 1; i < k; i++)
{
while(!dqmax.empty() && M[p][dqmax.back()] <= M[p][i])
dqmax.pop_back();
dqmax.push_back(i);
}
for(int i = k; i <= n; i++)
{
while(!dqmax.empty() && M[p][dqmax.back()] <= M[p][i])
dqmax.pop_back();
dqmax.push_back(i);
if(dqmax.front() <= i - k)
dqmax.pop_front();
maxim[p][i - k + 1] = M[p][dqmax.front()];
}
}
dqmin.clear();
dqmax.clear();
int mn = (1 << 30);
int nr = 0;
int k = lin;
for(int j = 1; j <= n - col + 1; j++)
{
dqmin.clear();
dqmax.clear();
for(int i = 1; i < k; i++)
{
while(!dqmin.empty() && minim[dqmin.back()][j] >= minim[i][j])
dqmin.pop_back();
dqmin.push_back(i);
}
for(int i = 1; i < k; i++)
{
while(!dqmax.empty() && maxim[dqmax.back()][j] <= maxim[i][j])
dqmax.pop_back();
dqmax.push_back(i);
}
for(int i = k; i <= m; i++)
{
while(!dqmin.empty() && minim[dqmin.back()][j] >= minim[i][j])
dqmin.pop_back();
dqmin.push_back(i);
if(dqmin.front() <= i - k)
dqmin.pop_front();
while(!dqmax.empty() && maxim[dqmax.back()][j] <= maxim[i][j])
dqmax.pop_back();
dqmax.push_back(i);
if(dqmax.front() <= i - k)
dqmax.pop_front();
if(mn > maxim[dqmax.front()][j] - minim[dqmin.front()][j])
{
mn = maxim[dqmax.front()][j] - minim[dqmin.front()][j];
nr = 0;
}
if(mn == maxim[dqmax.front()][j] - minim[dqmin.front()][j])
nr++;
}
}
return make_pair(mn, nr);
}
int main()
{
int p;
in >> m >> n >> p;
for(int i = 1; i <= m; i++)
for(int j = 1; j <= n; j++)
in >> M[i][j];
for(int i = 1; i <= p; i++)
{
int x, y;
in >> x >> y;
pair <int, int> aux1 = solve(x, y);
pair <int, int> aux2 = solve(y, x);
if(x == y)
out << aux1.first << " " << aux2.second;
else
{
if(aux1.first == aux2.first)
out << aux1.first << " " << aux1.second + aux2.second;
else if(aux1.first < aux2.first)
out << aux1.first << " " << aux1.second;
else
out << aux2.first << " " << aux2.second;
}
out << "\n";
}
return 0;
}