Pagini recente » Cod sursa (job #1056058) | Cod sursa (job #889121) | Cod sursa (job #2374225) | Cod sursa (job #892390) | Cod sursa (job #2833288)
#include <fstream>
#include <deque>
using namespace std;
int n, m, k, x, y, sol, ap;
deque<int> dmin;
deque<int> dmax;
int v[1010][1010];
int maxim[1010][1010];
int minim[1010][1010];
int main() {
ifstream fin("struti.in");
ofstream fout("struti.out");
fin >> n >> m >> k;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
fin >> v[i][j];
}
}
while (k--) {
fin >> x >> y;
sol = 8001;
ap=0;
for (int j = 1; j <= m; j++) {
dmin.push_back(1);
dmax.push_back(1);
for (int i = 2; i <= n; i++) {
while (!dmin.empty() && v[i][j] <= v[dmin.back()][j]) {
dmin.pop_back();
}
dmin.push_back(i);
if (i - dmin.front() == x) {
dmin.pop_front();
}
if (i>=x){
minim[i][j]=v[dmin.front()][j];
}
while (!dmax.empty() && v[i][j] >= v[dmax.back()][j]) {
dmax.pop_back();
}
dmax.push_back(i);
if (i - dmax.front() == x) {
dmax.pop_front();
}
if (i>=x){
maxim[i][j]=v[dmax.front()][j];
}
}
dmin.clear();
dmax.clear();
}
for (int i=x;i<=n;i++) {
dmin.push_back(1);
dmax.push_back(1);
for (int j = 2; j <= m; j++) {
while (!dmin.empty() && minim[i][j] < minim[i][dmin.back()]){
dmin.pop_back();
}
dmin.push_back(j);
if (j-dmin.front()==y){
dmin.pop_front();
}
while (!dmax.empty() && maxim[i][j] > maxim[i][dmax.back()]){
dmax.pop_back();
}
dmax.push_back(j);
if (j-dmax.front()==y){
dmax.pop_front();
}
if (j>=y){
if (maxim[i][dmax.front()]-minim[i][dmin.front()]<sol){
sol=maxim[i][dmax.front()]-minim[i][dmin.front()];
ap=1;
}
else if (maxim[i][dmax.front()]-minim[i][dmin.front()]==sol){
ap++;
}
}
}
dmin.clear();
dmax.clear();
}
swap(x, y);
if (x!=y) {
for (int j = 1; j <= m; j++) {
dmin.push_back(1);
dmax.push_back(1);
for (int i = 2; i <= n; i++) {
while (!dmin.empty() && v[i][j] <= v[dmin.back()][j]) {
dmin.pop_back();
}
dmin.push_back(i);
if (i - dmin.front() == x) {
dmin.pop_front();
}
if (i >= x) {
minim[i][j] = v[dmin.front()][j];
}
while (!dmax.empty() && v[i][j] >= v[dmax.back()][j]) {
dmax.pop_back();
}
dmax.push_back(i);
if (i - dmax.front() == x) {
dmax.pop_front();
}
if (i >= x) {
maxim[i][j] = v[dmax.front()][j];
}
}
dmin.clear();
dmax.clear();
}
for (int i = x; i <= n; i++) {
dmin.push_back(1);
dmax.push_back(1);
for (int j = 2; j <= m; j++) {
while (!dmin.empty() && minim[i][j] < minim[i][dmin.back()]) {
dmin.pop_back();
}
dmin.push_back(j);
if (j - dmin.front() == y) {
dmin.pop_front();
}
while (!dmax.empty() && maxim[i][j] > maxim[i][dmax.back()]) {
dmax.pop_back();
}
dmax.push_back(j);
if (j - dmax.front() == y) {
dmax.pop_front();
}
if (j >= y) {
if (maxim[i][dmax.front()] - minim[i][dmin.front()] < sol) {
sol = maxim[i][dmax.front()] - minim[i][dmin.front()];
ap = 1;
} else if (maxim[i][dmax.front()] - minim[i][dmin.front()] == sol) {
ap++;
}
}
}
dmin.clear();
dmax.clear();
}
}
fout<<sol<<" "<<ap<<"\n";
}
return 0;
}