Pagini recente » Cod sursa (job #1104124) | Cod sursa (job #2331504) | Cod sursa (job #1184493) | Profil Ileoheaven | Cod sursa (job #3144846)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("struti.in");
ofstream fout ("struti.out");
const int dim = 1e3 + 5;
int a[dim][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;
for(int k = 1 ; k + c - 1 <= m ; ++k)
{
deque <int> minD , maxD;
for(int i = 1 ; i <= l ; ++i)
for(int j = k ; j <= k + c - 1 ; ++j)
{
while(!minD.empty() && minD.back() > a[i][j])
minD.pop_back();
minD.push_back(a[i][j]);
while(!maxD.empty() && maxD.back() < a[i][j])
maxD.pop_back();
maxD.push_back(a[i][j]);
}
if(maxD.front() - minD.front() < ans)
ans = maxD.front() - minD.front() , frq = 1;
else if(maxD.front() - minD.front() == ans)
++frq;
for(int i = 2 ; i + l - 1 <= n ; ++i)
{
for(int j = k ; j <= k + c - 1 ; ++j)
{
if(!minD.empty() && a[i - 1][j] == minD.front())
minD.pop_front();
if(!maxD.empty() && a[i - 1][j] == maxD.front())
maxD.pop_front();
}
for(int j = k ; j <= k + c - 1 ; ++j)
{
while(!minD.empty() && minD.back() > a[i + l - 1][j])
minD.pop_back();
minD.push_back(a[i + l - 1][j]);
while(!maxD.empty() && maxD.back() < a[i + l - 1][j])
maxD.pop_back();
maxD.push_back(a[i + l - 1][j]);
}
if(maxD.front() - minD.front() < ans)
ans = maxD.front() - minD.front() , frq = 1;
else if(maxD.front() - minD.front() == ans)
++frq;
}
}
}
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';
}
}