Pagini recente » Cod sursa (job #516120) | Cod sursa (job #2923617) | Cod sursa (job #2766330) | Cod sursa (job #1141826) | Cod sursa (job #424215)
Cod sursa(job #424215)
#include<fstream>
#define dmax 1004
using namespace std;
ifstream in("struti.in");
ofstream out("struti.out");
short int n,m,t,mat[dmax][dmax],sol1[dmax][dmax],a,b,dq1[dmax],dq2[dmax],sol2[dmax][dmax],mn=-1,nrm;
void solve(int a,int b)
{ int i,p1=1,p2=0,p11=1,p22=0,j;
for(i=1;i<=n;i++)
{ p1=1; p2=0; p11=1; p22=0;
for(j=1;j<=m;j++)
{ while( mat[i][dq1[p2]] < mat[i][j] && p2>=p1)
p2--;
p2++;
dq1[p2]=j;
if( j - dq1[p1] > b-1)
p1++;
sol1[i][j]=mat[i][dq1[p1]];
while( mat[i][dq2[p22]] > mat[i][j] && p22>=p11)
p22--;
p22++;
dq2[p22]=j;
if( j - dq2[p11] > b-1)
p11++;
sol2[i][j]=mat[i][dq2[p11]];
}
}
for(j=1;j<=m;j++)
{ p1=1; p2=0; p11=1; p22=0;
for(i=1;i<=n;i++)
{ while(sol1[dq1[p2]][j] < sol1[i][j] && p2>=p1)
p2--;
p2++;
dq1[p2]=i;
if(i - dq1[p1] > a-1)
p1++;
while(sol2[dq2[p22]][j] > sol2[i][j] && p22>=p11)
p22--;
p22++;
dq2[p22]=i;
if(i - dq2[p11] > a-1)
p11++;
if(i >= a && j >= b)
{ if(sol1[dq1[p1]][j] - sol2[dq2[p11]][j] < mn || mn==-1)
{ mn=sol1[dq1[p1]][j] - sol2[dq2[p11]][j];
nrm=1;
}
else if(sol1[dq1[p1]][j] - sol2[dq2[p11]][j] == mn )
nrm++;
}
}
}
//out<<mn<<'\n';
/*for(i=1;i<=n;i++)
{ for(j=1;j<=m;j++)
out<<sol1[i][j]<<" ";
out<<'\n';
}
out<<'\n';
for(i=1;i<=n;i++)
{ for(j=1;j<=m;j++)
out<<sol2[i][j]<<" ";
out<<'\n';
}
out<<'\n';*/
}
int main()
{ int i,j;
in>>n>>m>>t;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
in>>mat[i][j];
for(;t;t--)
{ in>>a>>b;
mn=-1;
nrm=0;
solve(a,b);
if(a!=b)
solve(b,a);
out<<mn<<" "<<nrm<<'\n';
}
in.close();
out.close();
return 0;
}