Pagini recente » Cod sursa (job #445317) | Cod sursa (job #1177826) | Cod sursa (job #1730188) | Cod sursa (job #626986) | Cod sursa (job #913886)
Cod sursa(job #913886)
#include <cstdio>
#include <cstring>
#include <deque>
#include <fstream>
using namespace std;
deque<int> d1;
deque<int> d2;
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++)
{
d1.clear();
d2.clear();
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++)
{
d1.clear();
d2.clear();
for(int j=1; j<=m; j++)
{
while(!d1.empty()&&j-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()&&j-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()
{
ifstream cin("struti.in");
freopen("struti.out","w",stdout);
cin>>n>>m>>p;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
{
cin>>x[i][j];
}
for(int i=1; i<=p; i++)
{
int a,b;
cin>>a>>b;
sp rez=solve(a,b);
sp rez2=solve(b,a);
if(a!=b)
{
if(rez2.a<rez.a)
rez=rez2;
else if(rez2.a==rez.a)
rez.b+=rez2.b;
}
printf("%d %d\n",rez.a,rez.b);
}
return 0;
}