Pagini recente » Cod sursa (job #3348277) | Cod sursa (job #1079876) | Cod sursa (job #989254) | Cod sursa (job #1554112) | Cod sursa (job #3308567)
#include<bits/stdc++.h>
using namespace std;
ifstream in("struti.in");
ofstream out("struti.out");
int n,m,p;
vector<vector<int>>v(1005,vector<int>(1005,0));
pair<int,int>solve(int dx,int dy) {
int ai=INT_MAX;
int an=0;
vector<vector<int>>xm(1005,vector<int>(1005,0));
vector<vector<int>>xM(1005,vector<int>(1005,0));
for(int i=1;i<=n;i++){
deque<int>dm;
deque<int>dM;
for(int j=1;j<=m;j++){
while(dm.size()&&v[i][dm.back()]>=v[i][j])
dm.pop_back();
dm.push_back(j);
if(dm.front()==j-dy)
dm.pop_front();
while(dM.size()&&v[i][dM.back()]<=v[i][j])
dM.pop_back();
dM.push_back(j);
if(dM.front()==j-dy)
dM.pop_front();
if(j>=dy){
xm[i][j]=v[i][dm.front()];
xM[i][j]=v[i][dM.front()];
}
}
}
for(int j=dy;j<=m;j++) {
deque<int>dm;
deque<int>dM;
for(int i=1;i<=n;i++){
while(dm.size()&&xm[dm.back()][j]>=xm[i][j])
dm.pop_back();
dm.push_back(i);
if(dm.front()==i-dx)
dm.pop_front();
while(dM.size()&&xM[dM.back()][j]<=xM[i][j])
dM.pop_back();
dM.push_back(i);
if(dM.front()==i-dx)
dM.pop_front();
if(i>=dx){
if(xM[dM.front()][j]-xm[dm.front()][j]<ai){
ai=xM[dM.front()][j]-xm[dm.front()][j];
an=1;
}else if(xM[dM.front()][j]-xm[dm.front()][j]==ai)
an++;
}
}
}
return{ai,an};
}
int main(){
in>>n>>m>>p;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
in>>v[i][j];
int x,y;
while(p--){
in>>x>>y;
if(x==y){
pair<int,int>a1=solve(x,y);
cout<<a1.first<<" "<<a1.second<<"\n";
}else{
pair<int,int>a1=solve(x,y),a2=solve(y,x);
if(a1.first<a2.first)
cout<<a1.first<<" "<<a1.second<<"\n";
else if(a1.first>a2.first)
cout<<a2.first<<" "<<a2.second<<"\n";
else
cout<<a1.first<<" "<<a1.second+a2.second<<"\n";
}
}
}