Pagini recente » Cod sursa (job #206162) | Cod sursa (job #3365757) | Cod sursa (job #3365945) | Cod sursa (job #194058) | Cod sursa (job #3366868)
#include <bits/stdc++.h>
using namespace std;
deque<int> linmax[1005];
deque<int> linmin[1005];
int v[1005][1005], n, m;
pair<int, int> check(int h, int w){
for(int i = 1; i <= m; i++){
while(!linmax[i].empty())
linmax[i].pop_back();
while(!linmin[i].empty())
linmin[i].pop_back();
}
int minn = 1e9, nr = 0;
for(int i = 1; i <= n; i++){
deque<pair<int, int>> dqmin, dqmax;
for(int j = 1; j <= m; j++){
//baga in linmax
while(!linmax[j].empty() && linmax[j].front() <= i - h) linmax[j].pop_front();
while(!linmax[j].empty() && v[i][j] >= v[linmax[j].back()][j]) linmax[j].pop_back();
linmax[j].push_back(i);
// baga in linmin
while(!linmin[j].empty() && linmin[j].front() <= i - h) linmin[j].pop_front();
while(!linmin[j].empty() && v[i][j] <= v[linmin[j].back()][j]) linmin[j].pop_back();
linmin[j].push_back(i);
//baga in dqmax
while(!dqmax.empty() && dqmax.front().first <= j - w) dqmax.pop_front();
while(!dqmax.empty() && dqmax.back().second <= v[linmax[j].front()][j]) dqmax.pop_back();
dqmax.push_back({j, v[linmax[j].front()][j]});
//baga in dqmin
while(!dqmin.empty() && dqmin.front().first <= j - w) dqmin.pop_front();
while(!dqmin.empty() && dqmin.back().second >= v[linmin[j].front()][j]) dqmin.pop_back();
dqmin.push_back({j, v[linmin[j].front()][j]});
if(i >= h && j >= w){
int maxnr = dqmax.front().second, minnr = dqmin.front().second;
if(maxnr - minnr < minn){
minn = maxnr - minnr;
nr = 1;
}
else if(maxnr - minnr == minn)
nr++;
}
}
}
return {minn, nr};
}
int main(){
ifstream cin("struti.in");
ofstream cout("struti.out");
int q;
cin >> n >> m >> q;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
cin >> v[i][j];
}
}
while(q--){
int h, w;
cin >> h >> w;
pair<int, int> ans1 = check(h, w);
pair<int, int> ans2 = check(w, h);
if(h == w){
cout << ans1.first << " " << ans1.second << '\n';
continue;
}
if(ans1.first == ans2.first){
cout << ans1.first << " " << ans1.second + ans2.second << '\n';
}
else{
ans1 = min(ans1, ans2);
cout << ans1.first << " " << ans1.second << '\n';
}
}
return 0;
}