Pagini recente » Cod sursa (job #490424) | Cod sursa (job #2983966) | Cod sursa (job #3222035) | Cod sursa (job #1318627) | Cod sursa (job #2761329)
#include <fstream>
#include <queue>
//#include <iostream>
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
const int nmax=1000, inf=(1<<30)-1;
int v[nmax+1][nmax+1];
deque <int> dq_min[nmax+1], dq_max[nmax+1], dmin, dmax;
int sol=inf,sol2=0;
void solutie(int a,int b, int n, int m){
for(int i=1;i<=m;i++){
while(dq_min[i].empty()==0){
dq_min[i].pop_back();
}
while(dq_max[i].empty()==0){
dq_max[i].pop_back();
}
}
while(dmin.empty()==0){
dmin.pop_back();
}
while(dmax.empty()==0){
dmax.pop_back();
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
while(dq_min[j].empty()==0&&v[dq_min[j].back()][j]>v[i][j]){
dq_min[j].pop_back();
}
dq_min[j].push_back(i);
if(dq_min[j].front()<=i-a){
dq_min[j].pop_front();
}
while(dq_max[j].empty()==0&&v[dq_max[j].back()][j]<v[i][j]){
dq_max[j].pop_back();
}
dq_max[j].push_back(i);
if(dq_max[j].front()<=i-a){
dq_max[j].pop_front();
}
if(i>=a){
while(dmin.empty()==0&&v[dq_min[dmin.back()].front()][dmin.back()]>v[dq_min[j].front()][j]){
dmin.pop_back();
}
dmin.push_back(j);
if(dmin.front()<=j-b){
dmin.pop_front();
}
while(dmax.empty()==0&&v[dq_max[dmax.back()].front()][dmax.back()]<v[dq_max[j].front()][j]){
dmax.pop_back();
}
dmax.push_back(j);
if(dmax.front()<=j-b){
dmax.pop_front();
}
if(j>=b){
if(sol>v[dq_max[dmax.front()].front()][dmax.front()]-v[dq_min[dmin.front()].front()][dmin.front()]){
sol=v[dq_max[dmax.front()].front()][dmax.front()]-v[dq_min[dmin.front()].front()][dmin.front()];
sol2=1;
}else if(sol==v[dq_max[dmax.front()].front()][dmax.front()]-v[dq_min[dmin.front()].front()][dmin.front()]){
sol2++;
}
//cout<<"("<<dq_min[dmin.front()].front()<<","<<dmin.front()<<") ";
}
}
//cout<<dq_min[j].front()<<" ";
}
//cout<<"\n";
while(dmin.empty()==0){
dmin.pop_back();
}
while(dmax.empty()==0){
dmax.pop_back();
}
}
}
int main(){
int m,n,p;
fin>>n>>m>>p;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
fin>>v[i][j];
}
}
for(int i=1;i<=p;i++){
int x,y;
fin>>x>>y;
sol=inf;
sol2=0;
if(x!=y){
solutie(x,y,n,m);
solutie(y,x,n,m);
fout<<sol<<" "<<sol2<<"\n";
}else{
solutie(x,y,n,m);
fout<<sol<<" "<<sol2<<"\n";
}
}
return 0;
}