Cod sursa(job #358405)
Utilizator | Data | 22 octombrie 2009 23:06:48 | |
---|---|---|---|
Problema | Struti | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 5.32 kb |
#include <stdio.h>
using namespace std;
int x[1010][1010],a1[1010][1010],b1[1010][1010],a2[1010][1010],b2[1010][1010],deq[1010],n,m,p,i,j,k,k1,a,b,min,num;
int main()
{
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
scanf("%d%d%d",&n,&m,&p);
for(i=1; i<=n; i++)
{
for(j=1; j<=m; j++)
scanf("%d",&x[i][j]);
}
for(i=1;i<=p;i++)
{
scanf("%d%d",&a,&b);
num=0;
min=2000000;
for(i=1; i<=n; i++)
{
k=1;
k1=1;
deq[1]=1;
for(j=1;j<a;j++)
{
while((x[i][deq[k]]>=x[i][j])&&(k>=k1))
k--;
k++;
deq[k]=j;
}
for(j=a;j<=m;j++)
{
if(deq[k1]<=j-a)
k1++;
while((x[i][deq[k]]>=x[i][j])&&(k>=k1))
k--;
k++;
deq[k]=j;
a1[i][j]=x[i][deq[k1]];
}
k=1;
k1=1;
deq[1]=1;
for(j=1;j<a;j++)
{
while((x[i][deq[k]]<=x[i][j])&&(k>=k1))
k--;
k++;
deq[k]=j;
}
for(j=a;j<=m;j++)
{
if(deq[k1]<=j-a)
k1++;
while((x[i][deq[k]]<=x[i][j])&&(k>=k1))
k--;
k++;
deq[k]=j;
b1[i][j]=x[i][deq[k1]];
}
}
for(i=a;i<=m;i++)
{
k=1;
k1=1;
deq[1]=1;
for(j=1;j<b;j++)
{
while((a1[deq[k]][i]>=a1[j][i])&&(k>=k1))
k--;
k++;
deq[k]=j;
}
for(j=b;j<=n;j++)
{
if(deq[k1]<=j-b)
k1++;
while((a1[deq[k]][i]>=a1[j][i])&&(k>=k1))
k--;
k++;
deq[k]=j;
a2[j][i]=a1[deq[k1]][i];
}
k=1;
k1=1;
deq[1]=1;
for(j=1;j<b;j++)
{
while((b1[deq[k]][i]<=b1[j][i])&&(k>=k1))
k--;
k++;
deq[k]=j;
}
for(j=b;j<=n;j++)
{
if(deq[k1]<=j-b)
k1++;
while((b1[deq[k]][i]<=b1[j][i])&&(k>=k1))
k--;
k++;
deq[k]=j;
b2[j][i]=b1[deq[k1]][i];
if (b2[j][i]-a2[j][i]<min)
{
min=b2[j][i]-a2[j][i];
num=0;
}
if (b2[j][i]-a2[j][i]==min)
{
num++;
}
}
}
if(a!=b){
for(i=1; i<=n; i++)
{
k=1;
k1=1;
deq[1]=1;
for(j=1;j<b;j++)
{
while((x[i][deq[k]]>=x[i][j])&&(k>=k1))
k--;
k++;
deq[k]=j;
}
for(j=b;j<=m;j++)
{
if(deq[k1]<=j-b)
k1++;
while((x[i][deq[k]]>=x[i][j])&&(k>=k1))
k--;
k++;
deq[k]=j;
a1[i][j]=x[i][deq[k1]];
}
k=1;
k1=1;
deq[1]=1;
for(j=1;j<b;j++)
{
while((x[i][deq[k]]<=x[i][j])&&(k>=k1))
k--;
k++;
deq[k]=j;
}
for(j=b;j<=m;j++)
{
if(deq[k1]<=j-b)
k1++;
while((x[i][deq[k]]<=x[i][j])&&(k>=k1))
k--;
k++;
deq[k]=j;
b1[i][j]=x[i][deq[k1]];
}
}
for(i=b;i<=m;i++)
{
k=1;
k1=1;
deq[1]=1;
for(j=1;j<a;j++)
{
while((a1[deq[k]][i]>=a1[j][i])&&(k>=k1))
k--;
k++;
deq[k]=j;
}
for(j=a;j<=n;j++)
{
if(deq[k1]<=j-a)
k1++;
while((a1[deq[k]][i]>=a1[j][i])&&(k>=k1))
k--;
k++;
deq[k]=j;
a2[j][i]=a1[deq[k1]][i];
}
k=1;
k1=1;
deq[1]=1;
for(j=1;j<a;j++)
{
while((b1[deq[k]][i]<=b1[j][i])&&(k>=k1))
k--;
k++;
deq[k]=j;
}
for(j=a;j<=n;j++)
{
if(deq[k1]<=j-a)
k1++;
while((b1[deq[k]][i]<=b1[j][i])&&(k>=k1))
k--;
k++;
deq[k]=j;
b2[j][i]=b1[deq[k1]][i];
if (b2[j][i]-a2[j][i]<min)
{
min=b2[j][i]-a2[j][i];
num=0;
}
if (b2[j][i]-a2[j][i]==min)
{
num++;
}
}
}
}
printf("%d %d\n",min,num);
}
return 0;
}