Pagini recente » Cod sursa (job #152889) | Cod sursa (job #2087116) | Cod sursa (job #1271972) | Cod sursa (job #1591313) | Cod sursa (job #3315104)
#include <bits/stdc++.h>
using namespace std;
const int N=1005;
int v[N][N],mn[N][N], aux[N][N], n, m, p, ans, cnt;
void solve(int x, int y){
deque<int>q;
//minimum
for (int i=0;i<n;i++){
for (int j=0;j<y;j++){
while (!q.empty() && v[i][q.back()]>v[i][j]){
q.pop_back();
}
q.push_back(j);
}
aux[i][0]=v[i][q.front()];
for (int j=1;j+y-1<m;j++){
while (!q.empty() && q.front()<j){
q.pop_front();
}
while (!q.empty() && v[i][q.back()]>v[i][j+y-1]){
q.pop_back();
}
q.push_back(j+y-1);
aux[i][j]=v[i][q.front()];
}
while (!q.empty())q.pop_back();
}
for (int j=0;j+y-1<m;j++){
for (int i=0;i<x;i++){
while (!q.empty() && aux[q.back()][j]>aux[i][j]){
q.pop_back();
}
q.push_back(i);
}
mn[0][j]=aux[q.front()][j];
for (int i=1;i+x-1<n;i++){
while (!q.empty() && q.front()<i){
q.pop_front();
}
while (!q.empty() && aux[q.back()][j]>aux[i+x-1][j]){
q.pop_back();
}
q.push_back(i+x-1);
mn[i][j]=aux[q.front()][j];
}
while (!q.empty())q.pop_back();
}
for (int i=0;i<n;i++){
for (int j=0;j<y;j++){
while (!q.empty() && v[i][q.back()]<v[i][j]){
q.pop_back();
}
q.push_back(j);
}
aux[i][0]=v[i][q.front()];
for (int j=1;j+y-1<m;j++){
while (!q.empty() && q.front()<j){
q.pop_front();
}
while (!q.empty() && v[i][q.back()]<v[i][j+y-1]){
q.pop_back();
}
q.push_back(j+y-1);
aux[i][j]=v[i][q.front()];
}
while (!q.empty())q.pop_back();
}
for (int j=0;j+y-1<m;j++){
for (int i=0;i<x;i++){
while (!q.empty() && aux[q.back()][j]<aux[i][j]){
q.pop_back();
}
q.push_back(i);
}
int newans=aux[q.front()][j]-mn[0][j];
if (newans<ans){
ans=newans;
cnt=0;
}
if (newans==ans){
cnt++;
}
for (int i=1;i+x-1<n;i++){
while (!q.empty() && q.front()<i){
q.pop_front();
}
while (!q.empty() && aux[q.back()][j]<aux[i+x-1][j]){
q.pop_back();
}
q.push_back(i+x-1);
newans=aux[q.front()][j]-mn[i][j];
if (newans<ans){
ans=newans;
cnt=0;
}
if (newans==ans){
cnt++;
}
}
while (!q.empty())q.pop_back();
}
}
int main()
{
freopen("struti.in", "r", stdin);
freopen("struti.out", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>n>>m>>p;
for (int i=0;i<n;i++){
for (int j=0;j<m;j++){
cin>>v[i][j];
}
}
while (p--){
int x,y;cin>>x>>y;
ans=1e9;
cnt=0;
solve(x,y);
if (x!=y){solve(y,x);}
cout<<ans<<' '<<cnt<<'\n';
}
return 0;
}