Cod sursa(job #1261830)
Utilizator | Data | 12 noiembrie 2014 19:02:40 | |
---|---|---|---|
Problema | Struti | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 3.5 kb |
#include <fstream>
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
int A[1002][1002],n,m,i,j,a,b,k,d[1002],p,u,d1[1002],p1,u1,mini,nr,aux;
int B[1002][1002],c[1002][1002];
int main(){
fin>>n>>m>>k;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
fin>>A[i][j];
for(;k>0;k--){
fin>>a>>b;
mini=8000;
nr=0;
for(i=1;i<=n;i++){
p1=1;
p=1;
u=1;
u1=1;
d[1]=1;
d1[1]=1;
for(j=2;j<=m;j++){
while(p<=u && A[i][j]<A[i][d[u]])
u--;
d[++u]=j;
if(j-d[p]==b)
p++;
if(j>=b)
c[i][j]=A[i][d[p]];
while(p1<=u1 && A[i][j]>A[i][d1[u1]])
u1--;
d1[++u1]=j;
if(j-d1[p1]==b)
p1++;
if(j>=b)
B[i][j]=A[i][d1[p1]];
}
}
for(j=b;j<=m;j++){
p1=1;
p=1;
u=1;
u1=1;
d[1]=1;
d1[1]=1;
for(i=2;i<=n;i++){
while(p<=u && c[i][j]<c[d[u]][j])
u--;
d[++u]=i;
if(i-d[p]==a) p++;
while(p1<=u1 && B[i][j]>B[d1[u1]][j])
u1--;
d1[++u1]=i;
if(i-d1[p1]==a) p1++;
if(i>=a){
if(B[d1[p1]][j]-c[d[p]][j]<mini)
mini=B[d1[p1]][j]-c[d[p]][j],nr=0;
if(B[d1[p1]][j]-c[d[p]][j]==mini)
nr++;
}
}
}
if(a!=b){
aux=a;
a=b;
b=aux;
for(i=1;i<=n;i++){
p1=1;
p=1;
u=1;
u1=1;
d[1]=1;
d1[1]=1;
for(j=2;j<=m;j++){
while(p<=u && A[i][j]<A[i][d[u]])
u--;
d[++u]=j;
if(j-d[p]==b)
p++;
if(j>=b)
c[i][j]=A[i][d[p]];
while(p1<=u1 && A[i][j]>A[i][d1[u1]])
u1--;
d1[++u1]=j;
if(j-d1[p1]==b)
p1++;
if(j>=b)
B[i][j]=A[i][d1[p1]];
}
}
for(j=b;j<=m;j++){
p1=1;
p=1;
u=1;
u1=1;
d[1]=1;
d1[1]=1;
for(i=2;i<=n;i++){
while(p<=u && c[i][j]<c[d[u]][j])
u--;
d[++u]=i;
if(i-d[p]==a) p++;
while(p1<=u1 && B[i][j]>B[d1[u1]][j])
u1--;
d1[++u1]=i;
if(i-d1[p1]==a) p1++;
if(i>=a){
if(B[d1[p1]][j]-c[d[p]][j]<mini)
mini=B[d1[p1]][j]-c[d[p]][j],nr=0;
if(B[d1[p1]][j]-c[d[p]][j]==mini)
nr++;
}
}
}
}
fout<<mini<<" "<<nr<<endl;
}
fin.close();fout.close();
return 0;
}