Pagini recente » Cod sursa (job #177396) | Cod sursa (job #2625056) | Cod sursa (job #2440329) | Cod sursa (job #1676052) | Cod sursa (job #2743142)
#include <fstream>
#include <deque>
using namespace std;
ifstream cin("struti.in");
ofstream cout("struti.out");
const int lmax = 1e3 + 5;
int m, n, p, ans, nr, a[lmax][lmax], mnL[lmax][lmax], mxL[lmax][lmax];
void read(){
cin >> n >> m >> p;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
cin >> a[i][j];
}
void solve(int x, int y){
deque <int> mn, mx;
for(int j = 1; j <= m; j++){
mn.clear();
mx.clear();
for(int i = 1; i <= n; i++)
{
while(!mn.empty() && i - x >= mn.front())
mn.pop_front();
while(!mn.empty() && a[i][j] <= a[mn.back()][j])
mn.pop_back();
mn.push_back(i);
while(!mx.empty() && i - x >= mx.front())
mx.pop_front();
while(!mx.empty() && a[i][j] >= a[mx.back()][j])
mx.pop_back();
mx.push_back(i);
mnL[i][j] = a[mn.front()][j];
mxL[i][j] = a[mx.front()][j];
}
}
for(int i = x; i <= n; i++){
mn.clear();
mx.clear();
for(int j = 1; j <= m; j++){
while(!mn.empty() && j - y >= mn.front())
mn.pop_front();
while(!mn.empty() && mnL[i][j] <= mnL[i][mn.back()])
mn.pop_back();
mn.push_back(j);
while(!mx.empty() && j - y >= mx.front())
mx.pop_front();
while(!mx.empty() && mxL[i][j] >= mxL[i][mx.back()])
mx.pop_back();
mx.push_back(j);
int dif = mxL[i][mx.front()] - mnL[i][mn.front()];
if(j >= y && dif < ans){
ans = dif;
nr = 1;
} else if(j >= y && dif == ans)
nr ++;
}
}
}
void queries(){
while(p--){
int dx, dy;
cin >> dx >> dy;
ans = 8001, nr = 0;
solve(dx, dy);
if(dx != dy)
solve(dy, dx);
cout << ans << " " << nr << "\n";
}
}
int main()
{
read();
queries();
return 0;
}