Pagini recente » Cod sursa (job #658938) | Cod sursa (job #2634779) | Cod sursa (job #2275857) | Cod sursa (job #2675372) | Cod sursa (job #2059659)
#include <bits/stdc++.h>
using namespace std;
ifstream fi("struti.in");
ofstream fo("struti.out");
const int LIM = 1001;
deque < pair<int,int> > primmax[LIM], primmin[LIM];
deque <int> secundmin, secundmax;
int hei[LIM][LIM], n, m;
inline int maxim(int col){
return hei[(primmax[col].front()).first][(primmax[col].front()).second];
}
inline int minim(int col){
return hei[(primmin[col].front()).first][(primmin[col].front()).second];
}
inline void dreapta(int lin, int col){
while(primmax[col].size() > 0 && hei[(primmax[col].back()).first][(primmax[col].back()).second] <= hei[lin][secundmax.front()])
primmax[col].pop_back();
primmax[col].push_back(make_pair(lin, secundmax.front()));
while(primmin[col].size() > 0 && hei[(primmin[col].back()).first][(primmin[col].back()).second] >= hei[lin][secundmin.front()])
primmin[col].pop_back();
primmin[col].push_back(make_pair(lin, secundmin.front()));
}
inline void stanga(int lin, int col, int d){
if(lin - primmax[col].front().first + 1 > d)
primmax[col].pop_front();
if(lin - primmin[col].front().first + 1 > d)
primmin[col].pop_front();
}
inline void calc(int d1, int d2, int* mn, int* nr){
int i, j;
*mn = 2000000000;
for(j = 1; j <= m; j++){
primmax[j].clear();
primmin[j].clear();
}
for(i = 1; i <= n; i++){
secundmin.clear();
secundmax.clear();
for(j = 1; j <= m; j++){
while(secundmin.size() > 0 && hei[i][secundmin.back()] >= hei[i][j])
secundmin.pop_back();
secundmin.push_back(j);
if(j - secundmin.front() + 1 > d2)
secundmin.pop_front();
while(secundmax.size() > 0 && hei[i][secundmax.back()] <= hei[i][j])
secundmax.pop_back();
secundmax.push_back(j);
if(j - secundmax.front() + 1 > d2)
secundmax.pop_front();
if(j >= d2){
dreapta(i,j);
stanga(i,j,d1);
if(i >= d1){
if(maxim(j) - minim(j) < *mn){
*mn = maxim(j) - minim(j);
*nr = 1;
}
else if(maxim(j) - minim(j) == *mn)
*nr = *nr + 1;
}
}
}
}
}
int main()
{
int minim1, minim2, nr1, nr2, i, j, p, d1, d2;
fi >> n >> m >> p;
for(i = 1; i <= n; i++)
for(j = 1; j <= m; j++)
fi >> hei[i][j];
for(; p > 0; p--){
fi >> d1 >> d2;
calc(d1, d2, &minim1, &nr1);
calc(d2, d1, &minim2, &nr2);
if(minim1 > minim2)
fo << minim1 << ' ' << nr1 << '\n';
else if(minim2 > minim1)
fo << minim2 << ' ' << nr2 << '\n';
else{
if(d1 != d2)
fo << minim1 << ' ' << nr1 + nr2 << '\n';
else
fo << minim2 << ' ' << nr1 << '\n';
}
}
return 0;
}