Pagini recente » Cod sursa (job #2686924) | Cod sursa (job #1281076) | Cod sursa (job #2843330) | Cod sursa (job #8392) | Cod sursa (job #2313625)
#include <fstream>
#include <deque>
#define NM 1002
using namespace std;
ifstream f("struti.in");
ofstream g("struti.out");
int n,m,i,j,k,l,x,y,p,soll,nr,d;
int a[NM][NM],b[NM][NM],mn[NM][NM],mx[NM][NM];
deque < int > dq;
int Min(int x,int y){
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
while(!dq.empty()&&a[i][j]<=a[i][dq.back()]) dq.pop_back();
dq.push_back(j);
if(j-y>=dq.front()) dq.pop_front();
if(j>=y) b[i][j-y+1]=a[i][dq.front()];
}
dq.clear();
}
dq.clear();
for(j=1;j<=m-y+1;j++){
for(i=1;i<=n;i++){
while(!dq.empty()&&b[i][j]<=b[dq.back()][j]) dq.pop_back();
dq.push_back(i);
if(i-x>=dq.front()) dq.pop_front();
if(i>=x) mn[i-x+1][j]=b[dq.front()][j];
}
dq.clear();
}
dq.clear();
}
int Max(int x,int y){
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
while(!dq.empty()&&a[i][j]>=a[i][dq.back()]) dq.pop_back();
dq.push_back(j);
if(j-y>=dq.front()) dq.pop_front();
if(j>=y) b[i][j-y+1]=a[i][dq.front()];
}
dq.clear();
}
dq.clear();
for(j=1;j<=m-y+1;j++){
for(i=1;i<=n;i++){
while(!dq.empty()&&b[i][j]>=b[dq.back()][j]) dq.pop_back();
dq.push_back(i);
if(i-x>=dq.front()) dq.pop_front();
if(i>=x) mx[i-x+1][j]=b[dq.front()][j];
}
dq.clear();
}
dq.clear();
}
int main()
{
f>>n>>m>>p;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++) f>>a[i][j];
for(k=1;k<=p;k++){
f>>x>>y; soll=NM*NM; nr=0;
for(l=1;l<=2;l++){
Min(x,y);
Max(x,y);
for(i=1;i<=n-x+1;i++)
for(j=1;j<=m-y+1;j++){
d=mx[i][j]-mn[i][j];
if(d<soll) soll=d,nr=1;
else
if(d==soll) nr++;
}
if(x==y) l=3;
else d=x,x=y,y=d;
}
g<<soll<<' '<<nr<<'\n';
}
return 0;
}