Pagini recente » Cod sursa (job #2925753) | Cod sursa (job #2475646) | Cod sursa (job #2480109) | Cod sursa (job #1606878) | Cod sursa (job #1173402)
#include<cstdio>
#include<deque>
using namespace std;
const int N=1000,INF=8000;
int a[N+1][N+1],mins[N+1][N+1],maxs[N+1][N+1],mint[N+1][N+1],maxt[N+1][N+1];
deque<int>d;
int lines,cols,n,m,t,minimum,nra;
void scan(){
int i,j;
scanf("%d%d%d",&n,&m,&t);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
scanf("%d",&a[i][j]);
}
void init(){
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
scan();
}
void setMins(){
int i,j;
for(i=1;i<=n;i++){
d.clear();
for(j=1;j<=m;j++){
while(!d.empty()&&a[i][j]<=a[i][d.back()])
d.pop_back();
d.push_back(j);
if(j-d.front()==cols)
d.pop_front();
if(j>=cols)
mins[i][j]=a[i][d.front()];
}
}
}
void setMaxs(){
int i,j;
for(i=1;i<=n;i++){
d.clear();
for(j=1;j<=m;j++){
while(!d.empty()&&a[i][j]>=a[i][d.back()])
d.pop_back();
d.push_back(j);
if(j-d.front()==cols)
d.pop_front();
if(j>=cols)
maxs[i][j]=a[i][d.front()];
}
}
}
void setMint(){
int i,j;
for(j=cols;j<=m;j++){
d.clear();
for(i=1;i<=n;i++){
while(!d.empty()&&mins[i][j]<=mins[d.back()][j])
d.pop_back();
d.push_back(i);
if(i-d.front()==lines)
d.pop_front();
if(i>=lines)
mint[i][j]=mins[d.front()][j];
}
}
}
void setMaxt(){
int i,j;
for(j=cols;j<=m;j++){
d.clear();
for(i=1;i<=n;i++){
while(!d.empty()&&maxs[i][j]>=maxs[d.back()][j])
d.pop_back();
d.push_back(i);
if(i-d.front()==lines)
d.pop_front();
if(i>=lines)
maxt[i][j]=maxs[d.front()][j];
}
}
}
void solve(){
int i,j;
setMins();
setMint();
setMaxs();
setMaxt();
for(i=lines;i<=n;i++)
for(j=cols;j<=m;j++){
if(maxt[i][j]-mint[i][j]==minimum)
nra++;
if(maxt[i][j]-mint[i][j]<minimum){
nra=1;
minimum=maxt[i][j]-mint[i][j];
}
}
}
void swap(){
int aux=lines;
lines=cols;
cols=aux;
}
void initQuerry(){
minimum=INF+1;
nra=0;
t--;
scanf("%d%d",&lines,&cols);
}
int main(){
init();
while(t>0){
initQuerry();
solve();
swap();
if(lines!=cols)
solve();
printf("%d %d\n",minimum,nra);
}
return 0;
}