Pagini recente » Cod sursa (job #1969319) | Cod sursa (job #2640756) | Cod sursa (job #2541578) | Cod sursa (job #2602361) | Cod sursa (job #3144859)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("struti.in");
ofstream fout ("struti.out");
const int dim = 1e3 + 5;
int a[dim][dim], maxi[dim], n, m, q, ans, frq, ans1, frq1, l, c;
void Solve (int l, int c, int &ans, int &frq)
{
ans = INT_MAX, frq = 0;
deque <int> maxD[dim], minD[dim];
for(int j = 1 ; j <= m ; ++j)
for(int i = 1 ; i <= l ; ++i)
{
while(!minD[j].empty() && minD[j].back() > a[i][j])
minD[j].pop_back();
minD[j].push_back(a[i][j]);
while(!maxD[j].empty() && maxD[j].back() < a[i][j])
maxD[j].pop_back();
maxD[j].push_back(a[i][j]);
}
for(int i = l ; i <= n ; ++i)
{
deque <int> dqMax, dqMin;
for(int j = 1 ; j <= c ; ++j)
{
while(!dqMax.empty() && dqMax.back() < maxD[j].front())
dqMax.pop_back();
dqMax.push_back(maxD[j].front());
while(!dqMin.empty() && dqMin.back() > minD[j].front())
dqMin.pop_back();
dqMin.push_back(minD[j].front());
}
if(dqMax.front() - dqMin.front() < ans)
ans = dqMax.front() - dqMin.front(), frq = 1;
else if(dqMax.front() - dqMin.front() == ans)
++frq;
for(int j = 2 ; j + c - 1 <= m ; ++j)
{
if(!dqMin.empty() && dqMin.front() == minD[j - 1].front())
dqMin.pop_front();
if(!dqMax.empty() && dqMax.front() == maxD[j - 1].front())
dqMax.pop_front();
while(!dqMax.empty() && dqMax.back() < maxD[j + c - 1].front())
dqMax.pop_back();
dqMax.push_back(maxD[j + c - 1].front());
while(!dqMin.empty() && dqMin.back() > minD[j + c - 1].front())
dqMin.pop_back();
dqMin.push_back(minD[j + c - 1].front());
if(dqMax.front() - dqMin.front() < ans)
ans = dqMax.front() - dqMin.front(), frq = 1;
else if(dqMax.front() - dqMin.front() == ans)
++frq;
}
for(int j = 1 ; j <= m ; ++j)
{
if(!minD[j].empty() && minD[j].front() == a[i - l + 1][j])
minD[j].pop_front();
if(!maxD[j].empty() && maxD[j].front() == a[i - l + 1][j])
maxD[j].pop_front();
while(!minD[j].empty() && minD[j].back() > a[i + 1][j])
minD[j].pop_back();
minD[j].push_back(a[i + 1][j]);
while(!maxD[j].empty() && maxD[j].back() < a[i + 1][j])
maxD[j].pop_back();
maxD[j].push_back(a[i + 1][j]);
}
}
}
int main()
{
fin >> n >> m >> q;
for(int i = 1 ; i <= n ; ++i)
for(int j = 1 ; j <= m ; ++j)
fin >> a[i][j];
while(q--)
{
fin >> l >> c;
Solve(l, c, ans, frq);
Solve(c , l , ans1 , frq1);
if(ans < ans1 || l == c)
fout << ans << " " << frq << '\n';
else if(ans == ans1 && l != c)
fout << ans << " " << frq + frq1 << '\n';
else
fout << ans1 << " " << frq1 << '\n';
}
}