Pagini recente » Cod sursa (job #3366919) | Cod sursa (job #3366914) | Cod sursa (job #3366915) | Cod sursa (job #3367312) | Cod sursa (job #3366885)
#include <fstream>
#include <deque>
using namespace std;
ifstream cin("struti.in");
ofstream cout("struti.out");
int v[1001][1001];
int min1[1001][1001];
int max1[1001][1001];
deque<pair<int,int>> colmax[1001];
deque<pair<int,int>> colmin[1001];
deque<pair<int,int>> qmin,qmax;
int n,m;
pair<int,int> query(int l,int c){
int i,j,maxq1=1e9,cnt=0;
for(j=1;j<=m;j++){
colmax[j].clear();
colmin[j].clear();
for(i=1;i<=n;i++){
while(!colmax[j].empty() && colmax[j].front().second<i-l+1)
colmax[j].pop_front();
while(!colmax[j].empty() && colmax[j].back().first<=v[i][j])
colmax[j].pop_back();
colmax[j].push_back({v[i][j],i});
while(!colmin[j].empty() && colmin[j].front().second<i-l+1)
colmin[j].pop_front();
while(!colmin[j].empty() && colmin[j].back().first>=v[i][j])
colmin[j].pop_back();
colmin[j].push_back({v[i][j],i});
min1[i][j]=colmin[j].front().first;
max1[i][j]=colmax[j].front().first;
}
}
for(i=1;i<=n-l+1;i++){
qmin.clear();
qmax.clear();
for(j=1;j<=m;j++){
while(!qmin.empty() && qmin.front().second<j-c+1)
qmin.pop_front();
while(!qmin.empty() && qmin.back().first>=min1[i+l-1][j])
qmin.pop_back();
qmin.push_back({min1[i+l-1][j],j});
while(!qmax.empty() && qmax.front().second<j-c+1)
qmax.pop_front();
while(!qmax.empty() && qmax.back().first<=max1[i+l-1][j])
qmax.pop_back();
qmax.push_back({max1[i+l-1][j],j});
if(j>=c){
if(qmax.front().first-qmin.front().first<maxq1){
maxq1=qmax.front().first-qmin.front().first;
cnt=1;
}else if(qmax.front().first-qmin.front().first==maxq1)
cnt++;
}
}
}
return {maxq1,cnt};
}
int main()
{
int l,c,p,i,j;
cin>>n>>m>>p;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
cin>>v[i][j];
}
}
for(i=1;i<=p;i++){
cin>>l>>c;
if(l!=c){
auto it1=query(l,c);
auto it2=query(c,l);
if(it1.first==it2.first){
cout<<it1.first<<" "<<it1.second+it2.second<<"\n";
}else if(it1.first<it2.first){
cout<<it1.first<<" "<<it1.second<<"\n";
}else{
cout<<it2.first<<" "<<it2.second<<"\n";
}
}else{
auto it=query(l,c);
cout<<it.first<<" "<<it.second<<"\n";
}
}
return 0;
}