Pagini recente » Cod sursa (job #383850) | Cod sursa (job #87431) | Cod sursa (job #1237373) | Cod sursa (job #1518080) | Cod sursa (job #914025)
Cod sursa(job #914025)
#include <cstdio>
#include <deque>
#define NMAX 1001
using namespace std;
deque < int > maxDeque,minDeque;
int M[NMAX][NMAX],Min[NMAX][NMAX],Max[NMAX][NMAX];
int n,m,P,L,C,nr,Difmin;
inline void citesc(){
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
scanf("%d%d%d",&n,&m,&P);
for(register int i=1;i<=n;++i)
for(register int j=1;j<=m;++j)
scanf("%d",&M[i][j]);
}
inline void Submat(int L,int C){
while(!minDeque.empty())
minDeque.pop_front();
while(!maxDeque.empty())
maxDeque.pop_front();
for(register int i=1;i<=n;++i){
while(!minDeque.empty())
minDeque.pop_front();
while(!maxDeque.empty())
maxDeque.pop_front();
for(register int j=1;j<=m;++j){
while(!minDeque.empty() && M[i][j] <= M[i][minDeque.back()])
minDeque.pop_back();
minDeque.push_back(j);
while(!maxDeque.empty() && M[i][j] >= M[i][maxDeque.back()])
maxDeque.pop_back();
maxDeque.push_back(j);
if(minDeque.front()+C ==j)
minDeque.pop_front();
if(maxDeque.front()+C == j)
maxDeque.pop_front();
if(j>=C){
Min[i][j] = M[i][minDeque.front()];
Max[i][j] = M[i][maxDeque.front()];
}
}
}
for(register int j=C;j<=m;++j){
while(!minDeque.empty())
minDeque.pop_front();
while(!maxDeque.empty())
maxDeque.pop_front();
for(register int i=1;i<=n;++i){
while(!minDeque.empty() && Min[i][j] <= Min[minDeque.back()][j])
minDeque.pop_back();
minDeque.push_back(i);
while(!maxDeque.empty() && Max[i][j] >= Max[maxDeque.back()][j])
maxDeque.pop_back();
maxDeque.push_back(i);
if(minDeque.front()+L == i)
minDeque.pop_front();
if(maxDeque.front()+L == i)
maxDeque.pop_front();
if(i>=L){
if(Max[maxDeque.front()][j]-Min[minDeque.front()][j] < Difmin){
Difmin = Max[maxDeque.front()][j]-Min[minDeque.front()][j];
nr=1;
}
else if(Max[maxDeque.front()][j]-Min[minDeque.front()][j] == Difmin)
++nr;
}
}
}
}
inline void write(){
while(P){
Difmin = 0x3f3f3f3f;
nr=0;
scanf("%d%d",&L,&C);
Submat(L,C);
if(L!=C)
Submat(C,L);
printf("%d %d\n",Difmin,nr);
--P;
}
}
int main(){
citesc();
write();
return 0;
}