Pagini recente » Cod sursa (job #428008) | huismacui | Cod sursa (job #747777) | Cod sursa (job #1074859) | Cod sursa (job #913027)
Cod sursa(job #913027)
#include <cstdio>
#include <cstring>
#include <deque>
using namespace std;
struct sp
{
int a;
int b;
sp()
{
a=0;
b=0;
}
sp(int x,int y)
{
a=x;
b=y;
}
};
int x[1010][1010];
int xmin[1010][1010];
int xmax[1010][1010];
int n,m,p;
void compute(int k)
{
memset(xmin,0,sizeof(xmin));
memset(xmax,0,sizeof(xmax));
for(int j=1; j<=m; j++)
{
deque<int> d1;
deque<int> d2;
for(int i=1; i<=n; i++)
{
while(!d1.empty()&&i-d1.front()>=k)
d1.pop_front();
while(!d1.empty()&&x[i][j]<x[d1.back()][j])
d1.pop_back();
d1.push_back(i);
xmin[i][j]=x[d1.front()][j];
while(!d2.empty()&&i-d2.front()>=k)
d2.pop_front();
while(!d2.empty()&&x[i][j]>x[d2.back()][j])
d2.pop_back();
d2.push_back(i);
xmax[i][j]=x[d2.front()][j];
}
}
}
sp solve(int l,int c)
{
compute(l);
int sol=32000;
int count=0;
for(int i=l; i<=n; i++)
{
deque<int> d1;
deque<int> d2;
for(int j=1; j<=m; j++)
{
while(!d1.empty()&&i-d1.front()>=c)
d1.pop_front();
while(!d1.empty()&&xmin[i][j]<xmin[i][d1.back()])
d1.pop_back();
d1.push_back(j);
while(!d2.empty()&&i-d2.front()>=c)
d2.pop_front();
while(!d2.empty()&&xmax[i][j]>xmax[i][d2.back()])
d2.pop_back();
d2.push_back(j);
if(j>=c)
{
int a=xmax[i][d2.front()]-xmin[i][d1.front()];
if(a==sol)
count++;
else if(a<sol)
{
sol=a;
count=1;
}
}
}
}
return sp(sol,count);
}
int main()
{
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
scanf("%d%d%d",&n,&m,&p);
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
{
scanf("%d",&x[i][j]);
}
for(int i=1; i<=p; i++)
{
int a,b;
scanf("%d%d",&a,&b);
sp rez=solve(a,b);
printf("%d %d\n",rez.a,rez.b);
}
return 0;
}