Pagini recente » Cod sursa (job #2558282) | Cod sursa (job #1430511) | Cod sursa (job #2268116) | Cod sursa (job #1925034) | Cod sursa (job #2446991)
#include<fstream>
#include<algorithm>
#include<deque>
using namespace std;
ifstream cin("struti.in");
ofstream cout("struti.out");
short n,m,p,x[2];
short mat[1005][1005];
int main(){
cin>>n>>m>>p;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>mat[i][j];
while(p--){
cin>>x[0]>>x[1];
deque<short> DeqMinline[2][1005],DeqMaxline[2][1005];
int DifMin=8005,Nr;
for(int j=1;j<=m;j++){
deque<pair<short,short> > DeqMinRectangle[2],DeqMaxRectangle[2];
for(int i=1;i<=n;i++)
for(int c=0;c<2;c++){
deque<short> &dmin=DeqMinline[c][i],&dmax=DeqMaxline[c][i];
deque<pair<short,short> > &hmin=DeqMinRectangle[c],&hmax=DeqMaxRectangle[c];
short *a=mat[i];
while(!dmin.empty() && a[dmin.back()]>=a[j]) dmin.pop_back();
dmin.push_back(j);
while(!dmax.empty() && a[dmax.back()]<=a[j]) dmax.pop_back();
dmax.push_back(j);
if(j>=x[c]){
while(!hmin.empty() && hmin.back().second>=a[dmin.front()]) hmin.pop_back();
hmin.push_back(make_pair(i,a[dmin.front()]));
while(!hmax.empty() && hmax.back().second<=a[dmax.front()]) hmax.pop_back();
hmax.push_back(make_pair(i,a[dmax.front()]));
if(i>=x[1-c]){
int Dif=hmax.front().second-hmin.front().second;
if(Dif<DifMin){
DifMin=Dif;
Nr=1;
}
else if(Dif==DifMin) ++Nr;
}
if(hmin.front().first==i-x[1-c]+1) hmin.pop_front();
if(hmax.front().first==i-x[1-c]+1) hmax.pop_front();
}
if(dmin.front()==j-x[c]+1) dmin.pop_front();
if(dmax.front()==j-x[c]+1) dmax.pop_front();
if(x[0]==x[1]) break;
}
}
cout<<DifMin<<' '<<Nr<<'\n';
}
}