Cod sursa(job #1558272)

Utilizator demetriad-dagpagDavid Demetriad demetriad-dagpag Data 28 decembrie 2015 22:39:49
Problema Struti Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 7.13 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()
{
    short n,m,p,i,j,k,dx,dy,l,u,dif;
    char c;
    int nr;
    freopen("struti.in","r",stdin);
    freopen("struti.out","w",stdout);
    scanf("%hd%hd%hd",&n,&m,&p);
    getchar();
    for(i=1; i<=n; i++)
        for(j=1; j<=m; j++){
            c=getchar();
            while(c!=' ' && c!='\n' && c!=EOF)
            {
                if(c>='0' && c<='9')
                    v[i][j]=v[i][j]*10+(c-'0');
                c=getchar();
            }
        }
    for(k=1; k<=p; k++)
    {
        scanf("%hd%hd",&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;
                }
                else
                    if(i>=dx && j>=dy && bmax_dx[i][j]-bmin_dx[i][j]==dif)
                        nr++;
                if(dx==dy)
                    f[i][j]=1;
                if(i>=dy && j>=dx && bmax_dy[i][j]-bmin_dy[i][j]<dif && f[i][j]==0)
                {
                    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]==0)
                        nr++;
            }
        printf("%hd %d\n",dif,nr);
    }

    return 0;
}