Pagini recente » Cod sursa (job #1388388) | Cod sursa (job #1376232) | Cod sursa (job #1387842) | Cod sursa (job #1525351) | Cod sursa (job #2662271)
#include <cstdio>
#include <deque>
#define nMax 1024
using namespace std;
int ar[nMax][nMax],n,m;
int x,y,sol,solCounter;
int arMin[nMax][nMax],arMax[nMax][nMax];
deque <int> qMin,qMax;
deque <int> qAMin,qAMax;
void read(int&q) {
int i,j;
scanf("%d%d%d",&n,&m,&q);
for(i=0;i<n;++i) {
for(j=0;j<m;++j) {
scanf("%d",&ar[i][j]);
}
}
}
void reset() {
qMin.clear();
qMax.clear();
qAMin.clear();
qAMax.clear();
}
void createUps() {
int i,j;
for(j=0;j<m;++j) {
qMin.clear();
qMax.clear();
for(i=0;i<n;++i) {
if(!qMin.empty()&&qMin.front()<i-x+1) {
qMin.pop_front();
}
for(;!qMin.empty()&&ar[i][j]<ar[qMin.back()][j];qMin.pop_back());
qMin.push_back(i);
arMin[i][j]=ar[qMin.front()][j];
if(!qMax.empty()&&qMax.front()<i-x+1) {
qMax.pop_front();
}
for(;!qMax.empty()&&ar[i][j]>ar[qMax.back()][j];qMax.pop_back());
qMax.push_back(i);
arMax[i][j]=ar[qMax.front()][j];
}
}
}
void adv(int li) {
int j;
qAMin.clear();
qAMax.clear();
for(j=0;j<y-1;++j) {
for(;!qAMin.empty()&&arMin[li][j]<arMin[li][qAMin.back()];qAMin.pop_back());
qAMin.push_back(j);
for(;!qAMax.empty()&&arMax[li][j]>arMax[li][qAMax.back()];qAMax.pop_back());
qAMax.push_back(j);
}
for(;j<m;++j) {
if(qAMin.front()<=j-y) {
qAMin.pop_front();
}
for(;!qAMin.empty()&&arMin[li][j]<arMin[li][qAMin.back()];qAMin.pop_back());
qAMin.push_back(j);
if(qAMax.front()<=j-y) {
qAMax.pop_front();
}
for(;!qAMax.empty()&&arMax[li][j]>arMax[li][qAMax.back()];qAMax.pop_back());
qAMax.push_back(j);
if(arMax[li][qAMax.front()]-arMin[li][qAMin.front()]<sol) {
sol=arMax[li][qAMax.front()]-arMin[li][qAMin.front()];
solCounter=1;
}
else {
if(arMax[li][qAMax.front()]-arMin[li][qAMin.front()]==sol) {
++solCounter;
}
}
}
}
void play() {
int i;
scanf("%d%d",&x,&y);
reset();
createUps();
for(i=x-1,sol=1<<30;i<n;++i) {
adv(i);
}
if(x!=y) {
x-=y;
y+=x;
x=y-x;
reset();
createUps();
for(i=x-1;i<n;++i) {
adv(i);
}
}
printf("%d %d\n",sol,solCounter);
}
int main() {
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
int q,iq;
read(q);
for(iq=0;iq<q;++iq) {
play();
}
return 0;
}