Cod sursa(job #212404)

Utilizator raduzerRadu Zernoveanu raduzer Data 5 octombrie 2008 13:06:23
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <stdio.h>
#include <string>

int n,m,t;
int a[1010][1010],ca[1010][1010],b[1010][1010];
int dq[2][1010][1010],d[1010];
int min,nr;

void deque(int n, int m, int x, int k)
{
     int i,j,st,fi;
     for (i=1; i<=n; ++i)
     {
         st=1;
         fi=0;
         for (j=1; j<=m; ++j)
         {
             if (j-d[st]>=x) ++st;
             while (fi>=st && a[i][j]<a[i][d[fi]]) --fi;
             d[++fi]=j;
             dq[k][i][j]=a[i][d[st]];
         }
     }
}

void solve(int tip, int dx, int dy)
{
     int i,j,k,l;
     
     deque(n,m,dy,tip);
     
     memcpy(a,dq[tip],sizeof(dq[tip]));
     
     for (i=1; i<=m; ++i)
         for (j=1; j<=n; ++j) b[i][j]=a[j][m-i+1];
     memcpy(a,b,sizeof(b));
         
     deque(m,n,dx,tip);
}

void rez(int dx,int dy)
{
     int i,j;
     memcpy(ca,a,sizeof(a));
     solve(0,dx,dy);
        
     for (i=1; i<=n; ++i)
         for (j=1; j<=m; ++j) a[i][j]=-ca[i][j];
              
     solve(1,dx,dy);
          
     for (i=1; i<=m-dy+1; ++i)
         for (j=dx; j<=n; ++j) 
         {
             if (-dq[1][i][j]-dq[0][i][j]<min) 
             { 
                  min=-dq[1][i][j]-dq[0][i][j]; 
                  nr=0; 
             }
             if (-dq[1][i][j]-dq[0][i][j]==min) ++nr;
         }
     memcpy(a,ca,sizeof(ca));
}


int main()
{
    freopen("struti.in","r",stdin);
    freopen("struti.out","w",stdout);
    
    int i,j,k,l;
    scanf("%d %d %d",&n,&m,&t);
    for (i=1; i<=n; ++i)
        for (j=1; j<=m; ++j)
            scanf("%d",&a[i][j]);
            
    while (t)
    {
          --t;
          min=2000000000;
          int dx,dy;
          scanf("%d %d",&dx,&dy);
          
          rez(dx,dy);
          if (dx!=dy) rez(dy,dx);
 
          printf("%d %d\n",min,nr);
    }
    return 0;
}