Pagini recente » Cod sursa (job #2552665) | Cod sursa (job #3235146) | Cod sursa (job #1445357) | Cod sursa (job #2312585) | Cod sursa (job #3135970)
//Ilie Dumitru
#include<cstdio>
#include<deque>
const int NMAX=1024;
const int VALMAX=8192;
int N, M;
int mat[NMAX][NMAX], minim[NMAX][NMAX], maxim[NMAX][NMAX], m[NMAX];
int min, nrMin;
std::deque<int> dq;
void calc(int a, int b)
{
int i, j, x;
for(i=0;i<N;++i)
{
for(j=0;j<M;++j)
{
while(!dq.empty() && mat[i][dq.back()]>mat[i][j])
dq.pop_back();
dq.push_back(j);
if(dq.front()==j-b)
dq.pop_front();
minim[i][j]=mat[i][dq.front()];
}
dq.clear();
for(j=0;j<M;++j)
{
while(!dq.empty() && mat[i][dq.back()]<mat[i][j])
dq.pop_back();
dq.push_back(j);
if(dq.front()==j-b)
dq.pop_front();
maxim[i][j]=mat[i][dq.front()];
}
dq.clear();
}
for(j=b-1;j<M;++j)
{
for(i=0;i<N;++i)
{
while(!dq.empty() && minim[dq.back()][j]>minim[i][j])
dq.pop_back();
dq.push_back(i);
if(dq.front()==i-a)
dq.pop_front();
m[i]=minim[dq.front()][j];
}
dq.clear();
for(i=0;i<N;++i)
{
while(!dq.empty() && maxim[dq.back()][j]<maxim[i][j])
dq.pop_back();
dq.push_back(i);
if(dq.front()==i-a)
dq.pop_front();
if(i>=a-1)
{
if((x=maxim[dq.front()][j]-m[i])<min)
min=x, nrMin=1;
else if(x==min)
++nrMin;
}
}
dq.clear();
}
}
int main()
{
FILE* f=fopen("struti.in", "r"), *g=fopen("struti.out", "w");
int i, j, _, a, b;
fscanf(f, "%d%d%d", &N, &M, &_);
for(i=0;i<N;++i)
for(j=0;j<M;++j)
fscanf(f, "%d", mat[i]+j);
do
{
fscanf(f, "%d%d", &a, &b);
min=VALMAX;
nrMin=0;
calc(a, b);
if(a!=b)
calc(b, a);
fprintf(g, "%d %d\n", min, nrMin);
}while(--_);
fclose(f);
fclose(g);
return 0;
}