Pagini recente » Cod sursa (job #2072960) | Cod sursa (job #1556944) | Cod sursa (job #678751) | Cod sursa (job #409932) | Cod sursa (job #481353)
Cod sursa(job #481353)
#include<fstream>
#include <deque>
#define Nmax 1002
#define idx first
#define val second
#define mp make_pair
#define INF 2147000000
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
int A[Nmax][Nmax],Max[Nmax][Nmax],Min[Nmax][Nmax];
int dM[Nmax],dm[Nmax];
int n,m,t,min_val,nr;
inline int Minim(int x,int y){ return x<y ? x:y;}
void solve(int dx,int dy){
int i,j,pm,um,pM,uM;
for(j=1;j<=m;++j){
pm=pM=1; um=uM=0;
for(i=1;i<=n;++i){
while(uM>=pM && A[dM[uM]][j] < A[i][j])
uM--;
dM[++uM]=i;
while(um>=pm && A[dm[um]][j] > A[i][j])
um--;
dm[++um]=i;
while( dM[pM]+dx-1<i ) pM++;
while( dm[pm]+dx-1<i ) pm++;
Max[i][j]=A[dM[pM]][j];
Min[i][j]=A[dm[pm]][j];
}
}
for(i=dx;i<=n;++i){
pm=pM=1; um=uM=0;
for(j=1;j<=m;++j){
while(uM>=pM && Max[i][dM[uM]] < Max[i][j])
uM--;
dM[++uM]=j;
while(um>=pm && Min[i][dm[um]] > Min[i][j])
um--;
dm[++um]=j;
while(dM[pM]+dy-1<j) pM++;
while(dm[pm]+dy-1<j) pm++;
if(j>=dy)
if( Max[i][dM[pM]]-Min[i][dm[pm]] < min_val ){
min_val=Max[i][dM[pM]]-Min[i][dm[pm]];
nr=1;
}else
if( Max[i][dM[pM]]-Min[i][dm[pm]] == min_val)
++nr;
}
}
}
int main(){
int dx,dy,i,j;
fin>>n>>m>>t;
for(i=1;i<=n;++i)
for(j=1;j<=m;++j)fin>>A[i][j];
for(; t; --t){
fin>>dx>>dy;
min_val=INF; nr=0;
solve(dx,dy);
if( dx!=dy ) solve(dy,dx);
fout<<min_val<<" "<<nr<<"\n";
}
fin.close(); fout.close();
return 0;
}