Pagini recente » Cod sursa (job #99648) | Cod sursa (job #2683730) | Cod sursa (job #340189) | Cod sursa (job #2941825) | Cod sursa (job #2135897)
#include <stdio.h>
#include <stdlib.h>
int v[1000][1000];
int dmax[1000][1000];
int dmin[1000][1000];
int deque1[1000][2];
int deque2[1000][2];
int main()
{
int n,m,p,i,j,k,l,c,fin1,st1,fin2,st2,q,min,nrmin;
FILE*fi,*fo;
fi=fopen("struti.in","r");
fo=fopen("struti.out","w");
fscanf(fi,"%d%d%d",&n,&m,&p);
for(i=0; i<n; i++)
for(j=0; j<m; j++)
fscanf(fi,"%d",&v[i][j]);
for(k=0; k<p; k++)
{
fscanf(fi,"%d%d",&l,&c);
min=10000;
for(i=0; i<n; i++)
{
fin1=0;
st1=0;
q=0;
while(q<c)
{
while(fin1>st1 && v[i][q]<deque1[fin1-1][0])
fin1--;
deque1[fin1][0]=v[i][q];
deque1[fin1][1]=q;
fin1++;
q++;
}
dmin[i][0]=deque1[st1][0];
while(q<m)
{
if(q-deque1[st1][1]>=c)
st1++;
while(fin1>st1 && v[i][q]<deque1[fin1-1][0])
fin1--;
deque1[fin1][0]=v[i][q];
deque1[fin1][1]=q;
dmin[i][q-c+1]=deque1[st1][0];
fin1++;
q++;
}
}
for(i=0; i<n; i++)
{
fin1=0;
st1=0;
q=0;
while(q<c)
{
while(fin1>st1 && v[i][q]>deque1[fin1-1][0])
fin1--;
deque1[fin1][0]=v[i][q];
deque1[fin1][1]=q;
fin1++;
q++;
}
dmax[i][0]=deque1[st1][0];
while(q<m)
{
if(q-deque1[st1][1]>=c)
st1++;
while(fin1>st1 && v[i][q]>deque1[fin1-1][0])
fin1--;
deque1[fin1][0]=v[i][q];
deque1[fin1][1]=q;
dmax[i][q-c+1]=deque1[st1][0];
fin1++;
q++;
}
}
for(i=0; i<=m-c; i++)
{
fin1=0;
st1=0;
fin2=0;
st2=0;
q=0;
while(q<l)
{
while(fin1>st1 && dmin[q][i]<deque1[fin1-1][0])
fin1--;
deque1[fin1][0]=dmin[q][i];
deque1[fin1][1]=q;
fin1++;
while(fin2>st2 && dmax[q][i]>deque2[fin2-1][0])
fin2--;
deque2[fin2][0]=dmax[q][i];
deque2[fin2][1]=q;
fin2++;
q++;
}
if(deque2[st2][0]-deque1[st1][0]<min)
{
min=deque2[st2][0]-deque1[st1][0];
nrmin=1;
}
else if(deque2[st2][0]-deque1[st1][0]==min)
nrmin++;
while(q<n)
{
if(q-deque1[st1][1]>=l)
st1++;
if(q-deque2[st2][1]>=l)
st2++;
while(fin1>st1 && dmin[q][i]<deque1[fin1-1][0])
fin1--;
deque1[fin1][0]=dmin[q][i];
deque1[fin1][1]=q;
fin1++;
while(fin2>st2 && dmax[q][i]>deque2[fin2-1][0])
fin2--;
deque2[fin2][0]=dmax[q][i];
deque2[fin2][1]=q;
fin2++;
if(deque2[st2][0]-deque1[st1][0]<min)
{
min=deque2[st2][0]-deque1[st1][0];
nrmin=1;
}
else if(deque2[st2][0]-deque1[st1][0]==min)
nrmin++;
q++;
}
}
if(l!=c){
l+=c;
c=l-c;
l=l-c;
for(i=0; i<n; i++)
{
fin1=0;
st1=0;
q=0;
while(q<c)
{
while(fin1>st1 && v[i][q]<deque1[fin1-1][0])
fin1--;
deque1[fin1][0]=v[i][q];
deque1[fin1][1]=q;
fin1++;
q++;
}
dmin[i][0]=deque1[st1][0];
while(q<m)
{
if(q-deque1[st1][1]>=c)
st1++;
while(fin1>st1 && v[i][q]<deque1[fin1-1][0])
fin1--;
deque1[fin1][0]=v[i][q];
deque1[fin1][1]=q;
dmin[i][q-c+1]=deque1[st1][0];
fin1++;
q++;
}
}
for(i=0; i<n; i++)
{
fin1=0;
st1=0;
q=0;
while(q<c)
{
while(fin1>st1 && v[i][q]>deque1[fin1-1][0])
fin1--;
deque1[fin1][0]=v[i][q];
deque1[fin1][1]=q;
fin1++;
q++;
}
dmax[i][0]=deque1[st1][0];
while(q<m)
{
if(q-deque1[st1][1]>=c)
st1++;
while(fin1>st1 && v[i][q]>deque1[fin1-1][0])
fin1--;
deque1[fin1][0]=v[i][q];
deque1[fin1][1]=q;
dmax[i][q-c+1]=deque1[st1][0];
fin1++;
q++;
}
}
for(i=0; i<=m-c; i++)
{
fin1=0;
st1=0;
fin2=0;
st2=0;
q=0;
while(q<l)
{
while(fin1>st1 && dmin[q][i]<deque1[fin1-1][0])
fin1--;
deque1[fin1][0]=dmin[q][i];
deque1[fin1][1]=q;
fin1++;
while(fin2>st2 && dmax[q][i]>deque2[fin2-1][0])
fin2--;
deque2[fin2][0]=dmax[q][i];
deque2[fin2][1]=q;
fin2++;
q++;
}
if(deque2[st2][0]-deque1[st1][0]<min)
{
min=deque2[st2][0]-deque1[st1][0];
nrmin=1;
}
else if(deque2[st2][0]-deque1[st1][0]==min)
nrmin++;
while(q<n)
{
if(q-deque1[st1][1]>=l)
st1++;
if(q-deque2[st2][1]>=l)
st2++;
while(fin1>st1 && dmin[q][i]<deque1[fin1-1][0])
fin1--;
deque1[fin1][0]=dmin[q][i];
deque1[fin1][1]=q;
fin1++;
while(fin2>st2 && dmax[q][i]>deque2[fin2-1][0])
fin2--;
deque2[fin2][0]=dmax[q][i];
deque2[fin2][1]=q;
fin2++;
if(deque2[st2][0]-deque1[st1][0]<min)
{
min=deque2[st2][0]-deque1[st1][0];
nrmin=1;
}
else if(deque2[st2][0]-deque1[st1][0]==min)
nrmin++;
q++;
}
}}
fprintf(fo,"%d %d\n",min,nrmin);
}
fclose(fi);
fclose(fo);
return 0;
}