Cod sursa(job #1558189)

Utilizator demetriad-dagpagDavid Demetriad demetriad-dagpag Data 28 decembrie 2015 20:08:42
Problema Struti Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 6.92 kb
#include <stdio.h>
#include <stdlib.h>
short amin_dx[1001][1001],bmin_dx[1001][1001],amin_dy[1001][1001],bmin_dy[1001][1001],v[1001][1001],amax_dx[1001][1001],bmax_dx[1001][1001],amax_dy[1001][1001],bmax_dy[1001][1001],f[1001][1001];
short stiva[1001];
int main()
{
    int n,m,p,i,j,k,dx,dy,l,u,dif,nr;
    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",&v[i][j]);
    for(k=1; k<=p; k++)
    {
        scanf("%d%d",&dx,&dy);
        //min
        for(l=1; l<=n; l++)
        {
            stiva[1]=1;
            u=1;
            for(j=1; j<=dx; j++)
            {
                while(u>0 && v[l][j]<=v[l][stiva[u]])
                    u--;
                stiva[++u]=j;
            }
            p=1;
            i=2;
            amin_dx[l][dx]=v[l][stiva[p]];
            while(j<=m)
            {
                while(u>=p && stiva[p]<i)
                    p++;
                while(u>=p && v[l][j]<=v[l][stiva[u]])
                    u--;
                stiva[++u]=j;
                amin_dx[l][j]=v[l][stiva[p]];
                i++;
                j++;
            }
        }
        for(l=1; l<=n; l++)
        {
            stiva[1]=1;
            u=1;
            for(j=1; j<=dy; j++)
            {
                while(u>0 && v[l][j]<=v[l][stiva[u]])
                    u--;
                stiva[++u]=j;
            }
            p=1;
            i=2;
            amin_dy[l][dy]=v[l][stiva[p]];
            while(j<=m)
            {
                while(u>=p && stiva[p]<i)
                    p++;
                while(u>=p && v[l][j]<=v[l][stiva[u]])
                    u--;
                stiva[++u]=j;
                amin_dy[l][j]=v[l][stiva[p]];
                i++;
                j++;
            }
        }
        for(l=dx; l<=m; l++)
        {
            stiva[1]=1;
            u=1;
            for(j=1; j<=dy; j++)
            {
                while(u>0 && amin_dx[j][l]<=amin_dx[stiva[u]][l])
                    u--;
                stiva[++u]=j;
            }
            p=1;
            i=2;
            bmin_dy[dy][l]=amin_dx[stiva[p]][l];
            while(j<=n)
            {
                while(u>=p && stiva[p]<i)
                    p++;
                while(u>=p && amin_dx[j][l]<=amin_dx[stiva[u]][l])
                    u--;
                stiva[++u]=j;
                bmin_dy[j][l]=amin_dx[stiva[p]][l];
                i++;
                j++;
            }
        }
        for(l=dy; l<=m; l++)
        {
            stiva[1]=1;
            u=1;
            for(j=1; j<=dx; j++)
            {
                while(u>0 && amin_dy[j][l]<=amin_dy[stiva[u]][l])
                    u--;
                stiva[++u]=j;
            }
            p=1;
            i=2;
            bmin_dx[dx][l]=amin_dy[stiva[p]][l];
            while(j<=n)
            {
                while(u>=p && stiva[p]<i)
                    p++;
                while(u>=p && amin_dy[j][l]<=amin_dy[stiva[u]][l])
                    u--;
                stiva[++u]=j;
                bmin_dx[j][l]=amin_dy[stiva[p]][l];
                i++;
                j++;
            }
        }
        //max
        for(l=1; l<=n; l++)
        {
            stiva[1]=1;
            u=1;
            for(j=1; j<=dx; j++)
            {
                while(u>0 && v[l][j]>=v[l][stiva[u]])
                    u--;
                stiva[++u]=j;
            }
            p=1;
            i=2;
            amax_dx[l][dx]=v[l][stiva[p]];
            while(j<=m)
            {
                while(u>=p && stiva[p]<i)
                    p++;
                while(u>=p && v[l][j]>=v[l][stiva[u]])
                    u--;
                stiva[++u]=j;
                amax_dx[l][j]=v[l][stiva[p]];
                i++;
                j++;
            }
        }
        for(l=1; l<=n; l++)
        {
            stiva[1]=1;
            u=1;
            for(j=1; j<=dy; j++)
            {
                while(u>0 && v[l][j]>=v[l][stiva[u]])
                    u--;
                stiva[++u]=j;
            }
            p=1;
            i=2;
            amax_dy[l][dy]=v[l][stiva[p]];
            while(j<=m)
            {
                while(u>=p && stiva[p]<i)
                    p++;
                while(u>=p && v[l][j]>=v[l][stiva[u]])
                    u--;
                stiva[++u]=j;
                amax_dy[l][j]=v[l][stiva[p]];
                i++;
                j++;
            }
        }
        for(l=dx; l<=m; l++)
        {
            stiva[1]=1;
            u=1;
            for(j=1; j<=dy; j++)
            {
                while(u>0 && amax_dx[j][l]>=amax_dx[stiva[u]][l])
                    u--;
                stiva[++u]=j;
            }
            p=1;
            i=2;
            bmax_dy[dy][l]=amax_dx[stiva[p]][l];
            while(j<=n)
            {
                while(u>=p && stiva[p]<i)
                    p++;
                while(u>=p && amax_dx[j][l]>=amax_dx[stiva[u]][l])
                    u--;
                stiva[++u]=j;
                bmax_dy[j][l]=amax_dx[stiva[p]][l];
                i++;
                j++;
            }
        }
        for(l=dy; l<=m; l++)
        {
            stiva[1]=1;
            u=1;
            for(j=1; j<=dx; j++)
            {
                while(u>0 && amax_dy[j][l]>=amax_dy[stiva[u]][l])
                    u--;
                stiva[++u]=j;
            }
            p=1;
            i=2;
            bmax_dx[dx][l]=amax_dy[stiva[p]][l];
            while(j<=n)
            {
                while(u>=p && stiva[p]<i)
                    p++;
                while(u>=p && amax_dy[j][l]>=amax_dy[stiva[u]][l])
                    u--;
                stiva[++u]=j;
                bmax_dx[j][l]=amax_dy[stiva[p]][l];
                i++;
                j++;
            }
        }
        dif=8001;
        nr=0;
        for(i=1; i<=n; i++)
            for(j=1; j<=m; j++){
                if(i>=dx && j>=dy && bmax_dx[i][j]-bmin_dx[i][j]<dif)
                {
                    dif=bmax_dx[i][j]-bmin_dx[i][j];
                    nr=1;
                    if(dx==dy)
                        f[i][j]=1;
                }
                else
                    if(i>=dx && j>=dy && bmax_dx[i][j]-bmin_dx[i][j]==dif)
                        nr++,f[i][j]=1;
                if(i>=dy && j>=dx && bmax_dy[i][j]-bmin_dy[i][j]<dif && !f[i][j])
                {
                    dif=bmax_dy[i][j]-bmin_dy[i][j];
                    nr=1;
                }
                else
                    if(i>=dy && j>=dx && bmax_dy[i][j]-bmin_dy[i][j]==dif && !f[i][j])
                        nr++;
            }
        printf("%d %d\n",dif,nr);
    }

    return 0;
}