Pagini recente » Cod sursa (job #3314067) | Cod sursa (job #2375520) | Cod sursa (job #2881641) | Cod sursa (job #3260314) | Cod sursa (job #3308629)
#include <fstream>
#include<deque>
#include<algorithm>
#include<queue>
using namespace std;
ifstream cin("struti.in");
ofstream cout("struti.out");
int n,m,p;
int v[1006][1006];
int maxiv[1006][1006],miniv[1006][1006];
pair<int,int>sol(int x,int y){
int ans=(1<<30), cnt=0;
for(int i=1;i<=n;i++){
deque<int>mini,maxi;
for(int j=1;j<=m;j++){
while(!mini.empty() && v[i][j]<=v[i][mini.back()]){
mini.pop_back();
}
while(!maxi.empty() && v[i][j]>=v[i][maxi.back()]){
maxi.pop_back();
}
mini.push_back(j);
maxi.push_back(j);
if(mini.front()==j-y)mini.pop_front();
if(maxi.front()==j-y)maxi.pop_front();
if(j>=y){
miniv[i][j]=v[i][mini.front()];
maxiv[i][j]=v[i][maxi.front()];
}
}
}
for(int j=y;j<=m;j++){
deque<int>mini,maxi;
for(int i=1;i<=n;i++){
while(!mini.empty() && miniv[i][j]<=miniv[mini.back()][j])mini.pop_back();
while(!maxi.empty() && maxiv[i][j]>=maxiv[maxi.back()][j])maxi.pop_back();
mini.push_back(i);
maxi.push_back(i);
if(mini.front()==i-x)mini.pop_front();
if(maxi.front()==i-x)maxi.pop_front();
if(i>=x){
if(maxiv[maxi.front()][j]-miniv[mini.front()][j]<ans){
ans=maxiv[maxi.front()][j]-miniv[mini.front()][j];
cnt=1;
}
else if(maxiv[maxi.front()][j]-miniv[mini.front()][j]==ans)cnt++;
}
}
}
return {ans,cnt};
}
int main()
{
cin>>n>>m>>p;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>v[i][j];
}
}
int x,y;
for(int i=1;i<=p;i++){
cin>>x>>y;
if(x==y){
pair<int,int>ans=sol(x,y);
cout<<ans.first<<" "<<ans.second<<endl;
}
else {
pair<int,int>ans1=sol(x,y);
pair<int,int>ans2=sol(y,x);
if(ans1.first<ans2.first){
cout<<ans1.first<<" "<<ans1.second<<endl;
}
else if(ans1.first>ans2.first){
cout<<ans2.first<<" "<<ans2.second<<endl;
}
else{
cout<<ans1.first<<" "<<ans1.second+ans2.second<<endl;
}
}
}
}