Pagini recente » Cod sursa (job #1372580) | Rating Bene Ionut (benereaper) | Cod sursa (job #1057771) | Cod sursa (job #505558) | Cod sursa (job #2092274)
#include <bits/stdc++.h>
#define Nmax 1001
#define DIM 70000
using namespace std;
char buffer[DIM];
int poz=DIM-1;
void read(int &x)
{
x=0;
while(!isdigit(buffer[poz]))
if(++poz==DIM)
{
poz=0;
fread(buffer,1,DIM,stdin);
}
while(isdigit(buffer[poz]))
{
x=x*10+buffer[poz]-'0';
if(++poz==DIM)
{
poz=0;
fread(buffer,1,DIM,stdin);
}
}
}
deque <int> dq_min;
deque <int> dq_max;
int a[Nmax][Nmax];
int M1[Nmax][Nmax];
int M2[Nmax][Nmax];
int MM1[Nmax][Nmax];
int MM2[Nmax][Nmax];
int n,m,dx,dy,best,nr;
void solve()
{
int i,j;
for(i=1;i<=n;i++)
{
dq_min.clear();
dq_max.clear();
for(j=1;j<=m;j++)
{
while(!dq_min.empty() and a[i][j]<=a[i][dq_min.back()])
dq_min.pop_back();
dq_min.push_back(j);
if(dq_min.front()<=j-dy)
dq_min.pop_front();
M1[i][j]=a[i][dq_min.front()];
while(!dq_max.empty() and a[i][j]>=a[i][dq_max.back()])
dq_max.pop_back();
dq_max.push_back(j);
if(dq_max.front()<=j-dy)
dq_max.pop_front();
M2[i][j]=a[i][dq_max.front()];
}
}
for(j=dy;j<=m;j++)
{
dq_min.clear();
dq_max.clear();
for(i=1;i<=n;i++)
{
while(!dq_min.empty() and M1[i][j]<=M1[dq_min.back()][j])
dq_min.pop_back();
dq_min.push_back(i);
if(dq_min.front()<=i-dx)
dq_min.pop_front();
MM1[i][j]=M1[dq_min.front()][j];
while(!dq_max.empty() and M2[i][j]>=M2[dq_max.back()][j])
dq_max.pop_back();
dq_max.push_back(i);
if(!dq_max.empty() and dq_max.front()<=i-dx)
dq_max.pop_front();
MM2[i][j]=M2[dq_max.front()][j];
if(i>=dx)
{
if(MM2[i][j]-MM1[i][j]<best)
{
best=MM2[i][j]-MM1[i][j];
nr=1;
}
else if(MM2[i][j]-MM1[i][j]==best) ++nr;
}
}
}
}
int main()
{
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
int T,i,j;
read(n);
read(m);
read(T);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
read(a[i][j]);
while(T--)
{
best=INT_MAX;
nr=0;
read(dx);
read(dy);
solve();
if(dx!=dy)
{
swap(dx,dy);
solve();
}
printf("%d %d\n",best,nr);
}
return 0;
}