Pagini recente » Cod sursa (job #2503229) | Cod sursa (job #2744674) | Cod sursa (job #2787801) | Cod sursa (job #2908203) | Cod sursa (job #2759389)
#include <bits/stdc++.h>
using namespace std;
int n,m,query;
int v[1003][1003];
int min_mat[1003][1003];
int max_mat[1003][1003];
deque<int>q;
deque<int>q2;
struct elem{
int hmin,nr;
};
elem solve(int x,int y){
int ans=INT_MAX,nr=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
while(!q.empty() && v[i][j] < v[i][q.back()]){
q.pop_back();
}
q.push_back(j);
if(j-q.front()>=y){
q.pop_front();
}
if(j>=y){
min_mat[i][j-y+1]=v[i][q.front()];
}
}
q.clear();
}
q.clear();
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
while(!q.empty() && v[i][j] > v[i][q.back()]){
q.pop_back();
}
q.push_back(j);
if(j-q.front()>=y){
q.pop_front();
}
if(j>=y){
max_mat[i][j-y+1]=v[i][q.front()];
}
}
q.clear();
}
for(int j=1;j<=m-y+1;j++){
for(int i=1;i<=n;i++){
while(!q2.empty() && min_mat[i][j] < min_mat[q2.back()][j] ){
q2.pop_back();
}
q2.push_back(i);
if(i-q2.front()>=x){
q2.pop_front();
}
while(!q.empty() && max_mat[i][j] > max_mat[q.back()][j]){
q.pop_back();
}
q.push_back(i);
if(i-q.front()>=x){
q.pop_front();
}
if(i>=x){
if(ans > max_mat[q.front()][j] - min_mat[q2.front()][j] ){
ans=max_mat[q.front()][j] - min_mat[q2.front()][j];
nr=1;
}else if(ans == max_mat[q.front()][j] - min_mat[q2.front()][j] ){
nr++;
}
}
}
q.clear();
q2.clear();
}
return {ans,nr};
}
int main()
{
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
scanf("%d %d %d",&n,&m,&query);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&v[i][j]);
while(query--){
int x,y;
scanf("%d %d",&x,&y);
elem a = solve(x,y);
elem b = solve(y,x);
if(x==y){
printf("%d %d\n",a.hmin,a.nr);
continue;
}
if(a.hmin < b.hmin){
printf("%d %d\n",a.hmin,a.nr);
}else if(a.hmin > b.hmin){
printf("%d %d\n",b.hmin,b.nr);
}else{
printf("%d %d\n",a.hmin,a.nr+b.nr);
}
}
return 0;
}