Cod sursa(job #2133360)

Utilizator amarghescuAnton Marghescu amarghescu Data 16 februarie 2018 20:40:16
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.11 kb
#include<cstdio>
int v[1005][1005],minim[1005][1005],minim2[1005][1005],maxim[1005][1005],maxim2[1005][1005],n,m;
int deq[1005];
int calc(int x,int y){
int diam,i,j,st,dr,e;
diam=x;
for(j=1;j<=m;j++){
st=1;
dr=0;
for(e=1;e<=diam;e++){
while(dr>=st && v[e][j]<deq[dr])
dr--;
deq[++dr]=v[e][j];}
minim[1][j]=deq[st];
for(e=2;e<=n-diam+1;e++){
if (deq[st]==v[e-1][j])
st++;
while(dr>=st && v[e+diam-1][j]<deq[dr])
dr--;
deq[++dr]=v[e+diam-1][j];
minim[e][j]=deq[st];}}
diam=y;
for(j=1;j<=n;j++){
st=1;
dr=0;
for(e=1;e<=diam;e++){
while(dr>=st && minim[j][e]<deq[dr])
dr--;
deq[++dr]=minim[j][e];}
minim2[j][1]=deq[st];
for(e=2;e<=m-diam+1;e++){
if (deq[st]==minim[j][e-1])
st++;
while(dr>=st && minim[j][e+diam-1]<deq[dr])
dr--;
deq[++dr]=minim[j][e+diam-1];
minim2[j][e]=deq[st];}}
diam=x;
for(j=1;j<=m;j++){
st=1;
dr=0;
for(e=1;e<=diam;e++){
while(dr>=st && v[e][j]>deq[dr])
dr--;
deq[++dr]=v[e][j];}
maxim[1][j]=deq[st];
for(e=2;e<=n-diam+1;e++){
if (deq[st]==v[e-1][j])
st++;
while(dr>=st && v[e+diam-1][j]>deq[dr])
dr--;
deq[++dr]=v[e+diam-1][j];
maxim[e][j]=deq[st];}}
diam=y;
for(j=1;j<=n;j++){
st=1;
dr=0;
for(e=1;e<=diam;e++){
while(dr>=st && maxim[j][e]>deq[dr])
dr--;
deq[++dr]=maxim[j][e];}
maxim2[j][1]=deq[st];
for(e=2;e<=m-diam+1;e++){
if (deq[st]==maxim[j][e-1])
st++;
while(dr>=st && maxim[j][e+diam-1]>deq[dr])
dr--;
deq[++dr]=maxim[j][e+diam-1];
maxim2[j][e]=deq[st];}}}
int main(){
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
int p,i,j,mini,cnt=0,dx,dy,e;
scanf("%d%d%d",&n,&m,&p);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
scanf("%d",&v[i][j]);
for(i=1;i<=p;i++){
scanf("%d%d",&dx,&dy);
mini=2000000000;
cnt=0;
calc(dx,dy);
for(j=1;j<=n-dx+1;j++)
for(e=1;e<=m-dy+1;e++)
if (maxim2[j][e]-minim2[j][e]==mini)
cnt++;
else
if (maxim2[j][e]-minim2[j][e]<mini)
mini=maxim2[j][e]-minim2[j][e],cnt=1;
if (dx!=dy){
calc(dy,dx);
for(j=1;j<=n-dy+1;j++)
for(e=1;e<=m-dx+1;e++)
if (maxim2[j][e]-minim2[j][e]==mini)
cnt++;
else
if (maxim2[j][e]-minim2[j][e]<mini)
mini=maxim2[j][e]-minim2[j][e],cnt=1;}
printf("%d %d\n",mini,cnt);}
return 0;}