Pagini recente » Cod sursa (job #770431) | Cod sursa (job #1315976) | Cod sursa (job #2619214) | Cod sursa (job #953489) | Cod sursa (job #2068428)
#include <fstream>
#define DIM 1001
using namespace std;
ifstream fin ("struti.in");
ofstream fout ("struti.out");
int n,m,t,i,j,minim,ap,dx,dy;
int a[DIM][DIM],dmin[DIM][DIM],dmax[DIM][DIM],cmin[DIM][DIM],cmax[DIM][DIM],d[DIM];
int deque_ (int dx,int dy){
/// dmin[i][j] - minimul secventei de pe linia i, care incepe la pozitia j si are lungimea dy
for (int i=1;i<=n;i++){
d[1] = 1;
int p = 1;
int u = 1;
for (int j=2;j<=m;j++){
while (p<=u && a[i][j] <= a[i][d[u]])
u--;
d[++u] = j;
if (j-d[p] == dy)
p++;
if (j >= dy)
dmin[i][j-dy+1] = a[i][d[p]];
}
}
/// facem acelasi lucru, doar ca avem dmax
for (int i=1;i<=n;i++){
d[1] = 1;
int p = 1;
int u = 1;
for (int j=2;j<=m;j++){
while (p<=u && a[i][j] >= a[i][d[u]])
u--;
d[++u] = j;
if (j-d[p] == dy)
p++;
if (j >= dy)
dmax[i][j-dy+1] = a[i][d[p]];
}
}
/// facem pentru coloane minim
for (int j=1;j<=m-dy+1;j++){
int p = 1;
int u = 1;
d[1] = 1;
for (int i=2;i<=n;i++){
while (p<=u && dmin[i][j] <= dmin[d[u]][j])
u--;
d[++u] = i;
if (i-d[p] == dx)
p++;
if (i >= dx)
cmin[i-dx+1][j] = dmin[d[p]][j];
}
}
/// facem pentru coloane maxim
for (int j=1;j<=m-dy+1;j++){
int p = 1;
int u = 1;
d[1] = 1;
for (int i=2;i<=n;i++){
while (p<=u && dmax[i][j] >= dmax[d[u]][j])
u--;
d[++u] = i;
if (i-d[p] == dx)
p++;
if (i >= dx)
cmax[i-dx+1][j] = dmax[d[p]][j];
}
}
for (int i=1;i<=n-dx+1;i++)
for (int j=1;j<=m-dy+1;j++){
if (cmax[i][j] - cmin[i][j] < minim){
minim = cmax[i][j] - cmin[i][j];
ap = 1;
}
else{
if (cmax[i][j] - cmin[i][j] == minim)
ap++;
}
}
}
int main (){
fin>>n>>m>>t;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
fin>>a[i][j];
for (;t--;){
fin>>dx>>dy;
minim = 1000000000;
ap = 0;
deque_ (dx,dy);
if (dx != dy)
deque_ (dy,dx);
fout<<minim<<" "<<ap<<"\n";
}
return 0;
}