Pagini recente » Cod sursa (job #2845672) | Cod sursa (job #3212237) | Cod sursa (job #3283495) | Cod sursa (job #3275775) | Cod sursa (job #3178267)
#include <iostream>
#include <bits/stdc++.h>
#include <fstream>
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
deque<int> dq;
int n,m,p,x,y;
int a[1010][1010],s[1010][1010],minv[1010][1010];
int maxv[1010][1010];
// trebuie sa gasim min si max din fiecare dreptunghi dx dy
// facem un alg de tip sliding window cu deque pentru fiecare
// coloana si dupa folosim valorile din aux pentru a face acelasi
// lucru pe lini;
void valmin(int dx,int dy,int N,int M){
for(int i = 1; i <=n; i++){
for(int j = 1; j <=m; j++){
s[i][j] = 0;
minv[i][j] = 0;
maxv[i][j] = 0;
}
}
for(int j = 1; j <=m; j++){
for(int i = 1; i <=n; i++){
if(!dq.empty() && dq.front() == i-dx){
dq.pop_front();
};
while(!dq.empty() && a[dq.back()][j] >= a[i][j]){
dq.pop_back();
};
dq.push_back(i);
if(i >= dx){
s[i-dx+1][j] = a[dq.front()][j];};
};
while (!dq.empty()){
dq.pop_back();
}
};
for(int i = 1; i <=n; i++){
for(int j = 1; j <=m; j++){
s[i][j] = 0;
minv[i][j] = 0;
maxv[i][j] = 0;
}
}
for(int i = 1; i <= n-dx+1; i++){
for(int j = 1; j <=m; j++){
if(!dq.empty() && dq.front() == j-dy){
dq.pop_front();
};
while(!dq.empty() && s[i][dq.back()] >= s[i][j]){
dq.pop_back();
};
dq.push_back(j);
if(j >= dy){
minv[i][j-dy+1] = s[i][dq.front()];}
};
while(!dq.empty()){
dq.pop_back();
}
}
};
void valmax(int dx,int dy,int n,int m){
for(int i = 1; i <=n; i++){
for(int j = 1; j <=m; j++){
s[i][j] = 0;
minv[i][j] = 0;
maxv[i][j] = 0;
}
}
for(int j = 1; j <=m; j++){
for(int i = 1; i <=n; i++){
if(!dq.empty() && dq.front() == i-dx){
dq.pop_front();
};
while(!dq.empty() && a[dq.back()][j] <= a[i][j]){
dq.pop_back();
};
dq.push_back(i);
if(i >=dx){
s[i-dx+1][j] = a[dq.front()][j];}
};
while (!dq.empty()){
dq.pop_back();
}
};
for(int i = 1; i <=n; i++){
for(int j = 1; j <=m; j++){
s[i][j] = 0;
minv[i][j] = 0;
maxv[i][j] = 0;
}
}
for(int i = 1; i <= n-dx+1; i++){
for(int j = 1; j <=m; j++){
if(!dq.empty() && dq.front() == j-dy){
dq.pop_front();
};
while(!dq.empty() && s[i][dq.back()] <= s[i][j]){
dq.pop_back();
};
dq.push_back(j);
if(j >= y){
maxv[i][j-dy+1] = s[i][dq.front()];}
};
while(!dq.empty()){
dq.pop_back();
}
}
}
int main()
{
fin >> n >> m >> p;
for(int i = 1; i <=n; i++){
for(int j = 1; j <=m; j++){
fin >> a[i][j];
}
};
while(p--){
fin >> x >> y;
int diff = 10000;
int c = 0;
valmin(x,y,n,m);
valmax(x,y,n,m);
for(int i = 1; i <= n-x+1; i++){
for(int j = 1; j <= m-y+1; j++){
if(maxv[i][j]-minv[i][j] < diff){
diff = maxv[i][j]-minv[i][j];
c = 1;
}else if(maxv[i][j]-minv[i][j] == diff){
c++;
}
}
};
if(x!=y){
valmin(y,x,n,m);
valmax(y,x,n,m);
for(int i = 1; i <= n-y+1; i++){
for(int j = 1; j <= m-x+1; j++){
if(maxv[i][j]-minv[i][j] < diff){
diff = maxv[i][j]-minv[i][j];
c = 1;
}else if(maxv[i][j]-minv[i][j] == diff){
c++;
}
}
};
}
fout << diff << " " << c;
fout << '\n';
};
return 0;
}