Pagini recente » Cod sursa (job #1727936) | Cod sursa (job #2482241) | Cod sursa (job #165644) | Cod sursa (job #354481) | Cod sursa (job #2120797)
#include <fstream>
#include <deque>
using namespace std;
deque <int> Max;
deque <int> Min;
deque <int> lmin;
deque <int> lmax;
ifstream f("struti.in");
ofstream g("struti.out");
int n,m,i,j,a[1001][1001],sol,nr,t,x,y;
int jj,vmax,vmin;
int main()
{ int dx,dy,i,j,t;
f>>n>>m>>t;
for (i=1;i<=n;++i)
for (j=1;j<=m;++j)
f>>a[i][j];
for (; t; --t) {
f>>x>>y;
sol=8001;nr=0;
for (jj=1;jj<=m-y+1;++jj) {
for (i=1;i<=n;++i) {
vmax=0,vmin=8001;
for (j=jj;j<=jj+y-1;++j) {
vmax=max(vmax,a[i][j]);
vmin=min(vmin,a[i][j]);
}
while (!Max.empty() && vmax>=Max.back()) {
Max.pop_back();
lmax.pop_back();
}
while (!Min.empty() && vmin<=Min.back()) {
Min.pop_back();
lmin.pop_back();
}
Max.push_back(vmax),lmax.push_back(i);
Min.push_back(vmin),lmin.push_back(i);
if (i>=x) {
if (sol>Max.front()-Min.front())
sol=Max.front()-Min.front(),nr=1;
else if (sol==Max.front()-Min.front())
++nr;
}
if (lmax.front()==i-x+1) Max.pop_front(),lmax.pop_front();
if (lmin.front()==i-x+1) Min.pop_front(),lmin.pop_front();
}
Max.clear();lmax.clear();
Min.clear();lmin.clear();
}
if (x!=y) {
swap(x,y);
for (jj=1;jj<=m-y+1;++jj) {
for (i=1;i<=n;++i) {
vmax=0,vmin=8001;
for (j=jj;j<=jj+y-1;++j) {
vmax=max(vmax,a[i][j]);
vmin=min(vmin,a[i][j]);
}
while (!Max.empty() && vmax>=Max.back()) {
Max.pop_back();
lmax.pop_back();
}
while (!Min.empty() && vmin<=Min.back()) {
Min.pop_back();
lmin.pop_back();
}
Max.push_back(vmax),lmax.push_back(i);
Min.push_back(vmin),lmin.push_back(i);
if (i>=x) {
if (sol>Max.front()-Min.front())
sol=Max.front()-Min.front(),nr=1;
else if (sol==Max.front()-Min.front()) ++nr;
}
if (lmax.front()==i-x+1) Max.pop_front(),lmax.pop_front();
if (lmin.front()==i-x+1) Min.pop_front(),lmin.pop_front();
}
Max.clear();lmax.clear();
Min.clear();lmin.clear();
}
}
g<<sol<<" "<<nr<<"\n";
}
f.close();
g.close();
return 0;
}