Pagini recente » Cod sursa (job #2094755) | Cod sursa (job #212890) | Cod sursa (job #1591149) | Cod sursa (job #1066078) | Cod sursa (job #774766)
Cod sursa(job #774766)
#include<fstream>
#include<cstring>
#define dim 1050
using namespace std;
ifstream f("struti.in");
ofstream g("struti.out");
int DX,DY;
int A[dim][dim],MAX[dim][dim],MAX2[dim][dim],MINU[dim][dim],MINU2[dim][dim],deque[dim],front,back,n,m,p,i,j,NR,MIN;
void check (int DX,int DY ) {
for(j=1; j<=m; ++j ) {
front=1;back=0;
memset(deque,0,sizeof(deque));
for( i=1 ; i<=n ; ++i ) {
while(front <= back && A[i][j]>A[deque[back]][j])
--back;
deque[++back]= i;
if(deque[front]==i-DX)
front++;
if(i>=DX)
MAX[i-DX+1][j]=A[deque[front]][j];
}
}
for( i=1; i<=n; ++i) {
front=1;back=0;
memset(deque,0,sizeof(deque));
for( j=1 ;j<=m; ++j) {
while(front <= back && MAX[i][j]>MAX[i][deque[back]])
--back;
deque[++back]=j;
if(deque[front]==j-DY)
++front;
if(j>=DY)
MAX2[i][j-DY+1]=MAX[i][deque[front]];
}
}
for(j=1; j<=m; ++j ) {
front=1;back=0;
memset(deque,0,sizeof(deque));
for( i=1 ; i<=n ; ++i ) {
while(front <= back && A[i][j]<A[deque[back]][j])
--back;
deque[++back]=i;
if(deque[front]==i-DX)
front++;
if(i>=DX)
MINU[i-DX+1][j]=A[deque[front]][j];
}
}
for( i=1; i<=n; ++i) {
front=1;back=0;
memset(deque,0,sizeof(deque));
for( j=1 ;j<=m; ++j) {
while(front <= back && MINU[i][j]<MINU[i][deque[back]])
--back;
deque[++back]=j;
if(deque[front]==j-DY)
++front;
if(j>=DY)
MINU2[i][j-DY+1]=MINU[i][deque[front]];
}
}
for(i=1;i<=n-DX+1;++i) {
for(j=1;j<=m-DY+1; ++j ) {
if(MIN>MAX2[i][j]-MINU2[i][j]){
MIN=MAX2[i][j]-MINU2[i][j];
NR=1;
}
else
if(MIN==MAX2[i][j]-MINU2[i][j])
NR++;
}
}
}
int main (){
f>>n>>m>>p;
for( i=1 ; i<=n ; ++i )
for( j=1 ; j<=m ;++j)
f>>A[i][j];
for(;p;--p) {
f>>DX>>DY;
MIN=99999999;
memset(MAX2,0,sizeof(MAX2));
memset(MINU2,0,sizeof(MINU2));
check(DX,DY);
if(DX!=DY){
memset(MAX2,0,sizeof(MAX2));
memset(MINU2,0,sizeof(MINU2));
check(DY,DX);
}
g<<MIN<<" "<<NR<<"\n";
}
return 0;
}