Pagini recente » Cod sursa (job #2730446) | Cod sursa (job #2777099) | Cod sursa (job #2817292) | Cod sursa (job #559722) | Cod sursa (job #1304231)
#include <cstdio>
#include <fstream>
#include <deque>
#define nmax 1005
using namespace std;
ifstream f("struti.in");
ofstream g("struti.out");
int sol,n,m,p,nr;
int v[nmax][nmax];
int minim[nmax][nmax],maxim[nmax][nmax];
deque <int> x;
deque <int> xmin,xmax;
void dequeminlin(int l,int b)
{int i,j,t;
t=b;
for (i=1;i<=t;i++) {
while (!x.empty()&&v[l][i]<v[l][x.back()]) x.pop_back();
x.push_back(i);
}
while (t<=m)
{minim[l][t]=v[l][x.front()];
t++;
while (!x.empty()&&v[l][t]<v[l][x.back()]) x.pop_back();
x.push_back(t);
if (x.front()+b<=t) x.pop_front();
}
x.clear();
}
void dequemaxlin(int l,int b)
{int i,j,t;
t=b;
for (i=1;i<=t;i++) {
while (!x.empty()&&v[l][i]>v[l][x.back()]) x.pop_back();
x.push_back(i);
}
while (t<=m)
{maxim[l][t]=v[l][x.front()];
t++;
while (!x.empty()&&v[l][t]>v[l][x.back()]) x.pop_back();
x.push_back(t);
if (x.front()+b<=t) x.pop_front();
}
x.clear();
}
void Solve(int a,int b)
{int i,j,k;
for (i=1;i<=n;i++)
{dequeminlin(i,b);
dequemaxlin(i,b);
}
for (j=b;j<=m;j++) {
for (i=1;i<=a;i++) {
while (!xmin.empty()&&minim[i][j]<minim[xmin.back()][j])
xmin.pop_back();
xmin.push_back(i);
while (!xmax.empty()&&maxim[i][j]>maxim[xmax.back()][j])
xmax.pop_back();
xmax.push_back(i);
}
k=maxim[xmax.front()][j]-minim[xmin.front()][j];
if (k<sol) {
sol=k;
nr=1;
} else if (k==sol) nr++;
for (i=a+1;i<=n;i++) {
while (!xmin.empty()&&minim[i][j]<minim[xmin.back()][j])
xmin.pop_back();
xmin.push_back(i);
if (i-xmin.front()>=a) xmin.pop_front();
while (!xmax.empty()&&maxim[i][j]>maxim[xmax.back()][j])
xmax.pop_back();
xmax.push_back(i);
if (i-xmax.front()>=a) xmax.pop_front();
k=maxim[xmax.front()][j]-minim[xmin.front()][j];
if (k<sol) {
sol=k;
nr=1;
} else if (k==sol) nr++;
}
xmin.clear();
xmax.clear();
}
}
int main()
{ int i,j,a,b;
f>>n>>m>>p;
for (i=1;i<=n;i++) for (j=1;j<=m;j++)
f>>v[i][j];
for (i=1;i<=p;i++){
sol=1<<30;
f>>a>>b;
Solve(a,b);
if (a!=b) Solve(b,a);
g<<sol<<' '<<nr<<'\n';
}
return 0;
}