Cod sursa(job #779110)

Utilizator BlackLordFMI Alex Oprea BlackLord Data 16 august 2012 17:40:51
Problema Struti Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.29 kb
#include<stdio.h>
#include<string.h>
#define INF 1<<30
int aux, min, nr, D[1011], P, u, i, dx, dy, t, p, n, m, c[1011][1011], a[1011][1011], A[1011][1011], B[1011][1011], C[1011][1011],j;

void dmin()
{
    for(i=1; i<=m; i++)
    {
        p=1;
        u=0;
        memset(D,0,sizeof(D));
        for(j=1; j<=n; j++)
        {
            while(D[p] <= j-dx && p<=u) p++;
            while(p<=u && a[D[u]][i] >= a[j][i]) u--;
            u++;
            D[u] = j;
            if(j>=dx)
                A[j][i]= a[D[p]][i];
        }
	}
}


void dmax()
{
    for(i=1; i<=m; i++)
    {
        p=1;
        u=0;
        memset(D,0,sizeof(D));
        for(j=1; j<=n; j++)
        {
            while(D[p] <= j-dx && p<=u)  p++;
            while(p<=u && a[D[u]][i] <= a[j][i]) u--;
            u++;
            D[u] = j;
            if(j>=dx)
                A[j][i]= a[D[p]][i];
        }
    }
}


void d2min()
{
    for(i=dx; i<=n; i++)
    {
        p=1;
        u=0;
        memset(D,0,sizeof(D));
        for(j=1; j<=m; j++)
        {
            while(D[p] <= j-dy && p<=u) p++;
            while(p<=u && A[i][D[u]] >= A[i][j]) u--;
            u++;
            D[u] = j;
            if(j>=dy)
                B[i][j]= A[i][D[p]];
        }
    }
}


void d2max()
{
    for(i=dx; i<=n; i++)
    {
        p=1;
        u=0;
        memset(D,0,sizeof(D));
        for(j=1; j<=m; j++)
        {
            while(D[p] <= j-dy && p<=u)
                p++;
            while(p<=u && A[i][D[u]] <= A[i][j])
                u--;
            u++;
            D[u] = j;
            if(j>=dy)
                C[i][j]= A[i][D[p]];
        }
    }
}


int main()
{
    FILE *f=fopen("struti.in","r");
    FILE *g=fopen("struti.out","w");
    fscanf(f,"%d %d %d",&n,&m,&P);
    for(i=1; i<=n; i++)
        for(j=1; j<=m; j++)
            fscanf(f,"%d",&a[i][j]);
    for(t=1; t<=P; t++)
    {
        fscanf(f,"%d %d",&dx,&dy);
        dmin();
        d2min();
        for(i=dx; i<=n; i++)
            memset(A[i],0,sizeof(A[i]));
        dmax();
        d2max();
        min=INF;
        nr=0;
        for(i=dx; i<=n; i++)
            for(j=dy; j<=m; j++)
            {
                c[i][j]=C[i][j] - B[i][j];
                if(c[i][j] == min)
                    nr++;
                if(c[i][j]<min)
                {
                    min=c[i][j];
                    nr=1;
                }
                B[i][j]=A[i][j]=C[i][j]=0;
            }
        if(dx!=dy)
        {
            aux=dx;
            dx=dy;
            dy=aux;
            dmin();
            d2min();
            for(i=dx; i<=n; i++)
                memset(A[i],0,sizeof(A[i]));
            dmax();
            d2max();
            for(i=dx; i<=n; i++)
                for(j=dy; j<=m; j++)
                {
                    c[i][j]=C[i][j] - B[i][j];
                    if(c[i][j] == min)
                        nr++;
                    if(c[i][j]<min)
                    {
                        min=c[i][j];
                        nr=1;
                    }
                    B[i][j]=A[i][j]=C[i][j]=0;
                }
        }
        fprintf(g,"%d %d\n",min,nr);
    }
    fclose(f);
    fclose(g);
    return 0;
}