Pagini recente » Cod sursa (job #959849) | Cod sursa (job #2905827) | Clasament teme_acmunibuc_2013 | Cod sursa (job #224339) | Cod sursa (job #2446442)
#include<fstream>
#include<algorithm>
#include<deque>
using namespace std;
ifstream cin("struti.in");
ofstream cout("struti.out");
int n,m,p,x[2];
int 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<int> DeqMinline[2][1005],DeqMaxline[2][1005];
int DifMin=8005,Nr;
for(int j=1;j<=m;j++){
deque<pair<int,int> > DeqMinRectangle[2],DeqMaxRectangle[2];
for(int i=1;i<=n;i++)
for(int c=0;c<2;c++){
deque<int> &dmin=DeqMinline[c][i],&dmax=DeqMaxline[c][i];
deque<pair<int,int> > &hmin=DeqMinRectangle[c],&hmax=DeqMaxRectangle[c];
int *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';
}
}