Pagini recente » Cod sursa (job #2016210) | Cod sursa (job #1362777) | Cod sursa (job #2755192) | Cod sursa (job #1013331) | Cod sursa (job #937782)
Cod sursa(job #937782)
#include<fstream>
#include<cstring>
using namespace std;
ifstream f("struti.in");
ofstream g("struti.out");
int n,m,t,i,j,x,y,cur,p1,p2,u1,u2,vf,sol,nr,mi[1010],ma[1010],mini[1010][1010],maxi[1010][1010],a[1010][1010];
int abs(int x)
{
if(x<0)
return -x;
return x;
}
void rez(int x,int y)
{
for(i=1;i<=n;++i)
{
p1=u1=p2=u2=1;
vf=0;
mi[1]=1;
ma[1]=1;
for(j=2;j<=m;++j)
{
while(p1<=u1&&a[i][j]<=a[i][mi[u1]])
--u1;
while(p2<=u2&&a[i][j]>=a[i][ma[u2]])
--u2;
++u1;
mi[u1]=j;
++u2;
ma[u2]=j;
if(y<=j-mi[p1])
++p1;
if(y<=j-ma[p2])
++p2;
if(j>=y)
{
++vf;
mini[i][vf]=a[i][mi[p1]];
maxi[i][vf]=a[i][ma[p2]];
}
}
}
memset(mi,0,sizeof(mi));
memset(ma,0,sizeof(ma));
for(i=1;i<=vf;++i)
{
p1=p2=u1=u2=1;
mi[1]=1;
ma[1]=1;
for(j=2;j<=n;++j)
{
while(p1<=u1&&mini[j][i]<=mini[mi[u1]][i])
--u1;
while(p2<=u2&&maxi[j][i]>=maxi[ma[u2]][i])
--u2;
++u1;
++u2;
mi[u1]=j;
ma[u2]=j;
if(x<=j-mi[p1])
++p1;
if(x<=j-ma[p2])
++p2;
if(j>=x)
{
cur=abs(maxi[ma[p2]][i]-mini[mi[p1]][i]);
if(cur<sol)
{
sol=cur;
nr=1;
}
else
if(cur==sol)
++nr;
}
}
}
}
int main()
{
f>>n>>m>>t;
for(i=1;i<=n;++i)
for(j=1;j<=m;++j)
f>>a[i][j];
for(;t;--t)
{
sol=200000000;
f>>x>>y;
rez(x,y);
if(x!=y)
rez(y,x);
g<<sol<<' '<<nr<<'\n';
}
return 0;
}