Cod sursa(job #1396081)
Utilizator | Data | 22 martie 2015 02:13:46 | |
---|---|---|---|
Problema | Struti | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 3.61 kb |
#include<cstdio>
#define INF 2000000000
int n,m,t,a,b,p1,p2,u1,u2,i,j,nr,vmin,d1[1020],d2[1020],v[1020][1020],x[1020][1020],y[1020][1020];
FILE *f,*g;
int main(){
f=fopen("struti.in","r");
g=fopen("struti.out","w");
fscanf(f,"%d%d%d",&n,&m,&t);
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
fscanf(f,"%d",&v[i][j]);
}
}
while(t--){
fscanf(f,"%d%d",&a,&b);
vmin=INF;
nr=0;
for(i=1;i<=n;i++){
p1=p2=u1=u2=d1[1]=d2[1]=1;
for(j=2;j<=m;j++){
while( p1<=u1 && v[i][ d1[u1] ] > v[i][j] )
u1--;
d1[++u1]=j;
if(j-d1[p1]==b)
p1++;
if(j>=b)
x[i][j]=v[i][ d1[p1] ];
while( p2<=u2 && v[i][ d2[u2] ] < v[i][j] )
u2--;
d2[++u2]=j;
if(j-d2[p2]==b)
p2++;
if(j>=b)
y[i][j]=v[i][ d2[p2] ];
}
}
for(j=b;j<=m;j++){
p1=p2=u1=u2=d1[1]=d2[1]=1;
for(i=2;i<=n;i++){
while( p1<=u1 && x[i][j] < x[ d1[u1] ][j] )
u1--;
d1[++u1]=i;
if(i-d1[p1]==a)
p1++;
while( p2<=u2 && y[i][j] > y[ d2[u2] ][j] )
u2--;
d2[++u2]=i;
if(i-d2[p2]==a)
p2++;
if(i>=a){
if( y[ d2[p2] ][j] - x[ d1[p1] ][j] < vmin ){
vmin=y[ d2[p2] ][j] - x[ d1[p1] ][j];
nr=1;
}
else if( y[ d2[p2] ][j] - x[ d1[p1] ][j] == vmin )
nr++;
}
}
}
if(a!=b){
int aux=a;
a=b;
b=aux;
for(i=1;i<=n;i++){
p1=p2=u1=u2=d1[1]=d2[1]=1;
for(j=2;j<=m;j++){
while( p1<=u1 && v[i][ d1[u1] ] > v[i][j] )
u1--;
d1[++u1]=j;
if(j-d1[p1]==b)
p1++;
if(j>=b)
x[i][j]=v[i][ d1[p1] ];
while( p2<=u2 && v[i][ d2[u2] ] < v[i][j] )
u2--;
d2[++u2]=j;
if(j-d2[p2]==b)
p2++;
if(j>=b)
y[i][j]=v[i][ d2[p2] ];
}
}
for(j=b;j<=m;j++){
p1=p2=u1=u2=d1[1]=d2[1]=1;
for(i=2;i<=n;i++){
while( p1<=u1 && x[i][j] < x[ d1[u1] ][j] )
u1--;
d1[++u1]=i;
if(i-d1[p1]==a)
p1++;
while( p2<=u2 && y[i][j] > y[ d2[u2] ][j] )
u2--;
d2[++u2]=i;
if(i-d2[p2]==a)
p2++;
if(i>=a){
if( y[ d2[p2] ][j] - x[ d1[p1] ][j] < vmin ){
vmin=y[ d2[p2] ][j] - x[ d1[p1] ][j];
nr=1;
}
else if( y[ d2[p2] ][j] - x[ d1[p1] ][j] == vmin )
nr++;
}
}
}
}
fprintf(g,"%d %d\n",vmin,nr);
}
fclose(f);
fclose(g);
return 0;
}