Pagini recente » Cod sursa (job #1589880) | Cod sursa (job #228230) | Cod sursa (job #200002) | Cod sursa (job #1572131) | Cod sursa (job #2212939)
#include <deque>
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin ("struti.in");
ofstream fout ("struti.out");
const int Dim = 1001,Inf = 0x3f3f3f3f;
int A[Dim][Dim], M1[Dim][Dim],M2[Dim][Dim],n,m,p,m1[Dim][Dim],m2[Dim][Dim],mi,nr;
deque < int > D;
void Deq(int sizex,int sizey);
int main() {
fin >> n >> m >> p;
for ( int i = 1; i <= n; ++i)
for ( int j = 1; j <= m; ++j)
fin >> A[i][j];
int x,y;
for ( ; p > 0; --p) {
fin >> x >> y;
mi = Inf;
nr = 0;
Deq(x,y);
if ( y != x)
Deq(y,x);
fout << mi << " " << nr << "\n";
}
}
void Deq(int sizex,int sizey) {
memset(m1,0,sizeof(m1));
memset(M2,0,sizeof(M2));
memset(m2,0,sizeof(m2));
memset(M1,0,sizeof(M1));
D.clear();
for ( int j = 1; j <= m; ++j) {
D.push_front(1);
M1[1][j] = A[1][j];
for ( int i = 2; i <= sizex; ++i) {
while(D.size() and A[D.back()][j] <= A[i][j])
D.pop_back();
D.push_back(i);
M1[i][j] = A[D.front()][j];
}
for ( int i = sizex + 1; i <= n; ++i) {
while(D.size() and A[D.back()][j] <= A[i][j])
D.pop_back();
D.push_back(i);
while(D.size() and i - D.front() == sizex)
D.pop_front();
M1[i][j] = A[D.front()][j];
}
D.clear();
}
D.clear();
for ( int i = 1; i <= n; ++i) {
D.push_back(1);
M2[i][1] = M1[i][1];
for ( int j = 2; j <= sizey; ++j) {
while(D.size() and M1[i][j] >= M1[i][D.back()] )
D.pop_back();
D.push_back(j);
M2[i][j] = M1[i][D.front()];
}
for (int j = sizey + 1 ; j <= m; ++j) {
while ( D.size() and M1[i][j] >= M1[i][D.back()] )
D.pop_back();
D.push_back(j);
while(D.size() and j - D.front() == sizey)
D.pop_front();
M2[i][j] = M1[i][D.front()];
}
D.clear();}
D.clear();
for ( int j = 1; j <= m; ++j) {
D.push_front(1);
m1[1][j] = A[1][j];
for ( int i = 2; i <= sizex; ++i) {
while(D.size() and A[D.back()][j] >= A[i][j])
D.pop_back();
D.push_back(i);
m1[i][j] = A[D.front()][j];
}
for ( int i = sizex + 1; i <= n; ++i) {
while(D.size() and A[D.back()][j] >= A[i][j])
D.pop_back();
D.push_back(i);
while(D.size() and i - D.front() == sizex)
D.pop_front();
m1[i][j] = A[D.front()][j];
}
D.clear();}
D.clear();
for ( int i = 1; i <= n; ++i) {
D.push_back(1);
m2[i][1] = m1[i][1];
for ( int j = 2; j <= sizey; ++j) {
while(D.size() and m1[i][j] <= m1[i][D.back()] )
D.pop_back();
D.push_back(j);
m2[i][j] = m1[i][D.front()];
}
for ( int j = sizey + 1; j <= m; ++j) {
while ( D.size() and m1[i][j] <= m1[i][D.back()] )
D.pop_back();
D.push_back(j);
while(D.size() and j - D.front() == sizey)
D.pop_front();
m2[i][j] = m1[i][D.front()];
}
D.clear();}
for ( int i = sizex; i <= n; ++i)
for ( int j = sizey; j <= m; ++j)
if ( M2[i][j] - m2[i][j] < mi )
mi = M2[i][j] - m2[i][j],nr = 1;
else
if ( M2[i][j] - m2[i][j] == mi)
++nr;
}