Cod sursa(job #779120)

Utilizator BlackLordFMI Alex Oprea BlackLord Data 16 august 2012 17:59:18
Problema Struti Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.94 kb
#include <stdio.h>
#define DIM 1002
#define MAX 10000
int a[DIM][DIM];
int b[DIM][DIM];
int b1[DIM][DIM];
int dq[DIM][DIM];
int dq1[DIM][DIM];
int eq[DIM][DIM];
int eq1[DIM][DIM];
int rmin[DIM][DIM];
int rmax[DIM][DIM];
int X,Y,P,dx,dy,i,j,k,p,p1,u,u1,min,nr,aux;
int main()
{
    FILE *f = fopen("struti.in","r");
    FILE *g = fopen("struti.out","w");
    fscanf(f,"%d%d%d",&X,&Y,&P);
    for (i=1; i<=X; i++)
        for (j=1; j<=Y; j++)
            fscanf(f,"%d",&a[i][j]);
    for (k=1; k<=P; k++)
    {
        fscanf(f,"%d %d",&dx,&dy);
        for (j=1; j<=Y; j++)
        {
            dq[1][j] = 1;
            p=1;
            u=1;
            for (i=2; i<=X; i++)
            {
                while(p<=u && a[dq[u][j]][j]>a[i][j])
                    u--;
                dq[++u][j] = i;
                if (i>=dx)
                    b[i][j] = a[dq[p][j]][j];
                if (i-dx+1 == dq[p][j])
                    p++;
            }
            dq1[1][j]=1;
            p1=1;
            u1=1;
            for (i=2; i<=X; i++)
            {
                while(p1<=u1 && a[dq1[u1][j]][j]<a[i][j])
                    u1--;
                dq1[++u1][j] = i;
                if (i>=dx)
                    b1[i][j] = a[dq1[p1][j]][j];
                if (i-dx+1 == dq1[p1][j])
                    p1++;
            }
        }
        for (i=dx; i<=X; i++)
        {
            eq[i][1] = 1;
            p=1;
            u=1;
            for (j=2; j<=Y; j++)
            {
                while (p<=u && b[i][j]<b[i][eq[i][u]])
                    u--;
                eq[i][++u] = j;
                if (j>=dy)
                    rmin[i][j] = b[i][eq[i][p]];
                if (j-dy+1 == eq[i][p])
                    p++;
            }
            eq1[i][1] = 1;
            p1=1;
            u1=1;
            for (j=2; j<=Y; j++)
            {
                while (p1<=u1 && b1[i][j]>b1[i][eq1[i][u1]])
                    u1--;
                eq1[i][++u1] = j;
                if (j>=dy)
                    rmax[i][j] = b1[i][eq1[i][p1]];
                if (j-dy+1 == eq1[i][p1])
                    p1++;
            }
        }
        min = MAX;
        nr = 0;
        for (i=dx; i<=X; i++)
            for (j=dy; j<=Y; j++)
                if (rmax[i][j]-rmin[i][j]<min)
                {
                    min = rmax[i][j]-rmin[i][j];
                    nr = 1;
                }
                else if (rmax[i][j]-rmin[i][j]==min)
                    nr++;
        if (dx!=dy)
        {
            aux = dx;
            dx = dy;
            dy = aux;
            for (j=1; j<=Y; j++)
            {
                dq[1][j] = 1;
                p=1;
                u=1;
                for (i=2; i<=X; i++)
                {
                    while(p<=u && a[dq[u][j]][j]>a[i][j])
                        u--;
                    dq[++u][j] = i;
                    if (i>=dx)
                        b[i][j] = a[dq[p][j]][j];
                    if (i-dx+1 == dq[p][j])
                        p++;
                }
                dq1[1][j]=1;
                p1=1;
                u1=1;
                for (i=2; i<=X; i++)
                {
                    while(p1<=u1 && a[dq1[u1][j]][j]<a[i][j])
                        u1--;
                    dq1[++u1][j] = i;
                    if (i>=dx)
                        b1[i][j] = a[dq1[p1][j]][j];
                    if (i-dx+1 == dq1[p1][j])
                        p1++;
                }
            }
            for (i=dx; i<=X; i++)
            {
                eq[i][1] = 1;
                p=1;
                u=1;
                for (j=2; j<=Y; j++)
                {
                    while (p<=u && b[i][j]<b[i][eq[i][u]])
                        u--;
                    eq[i][++u] = j;
                    if (j>=dy)
                        rmin[i][j] = b[i][eq[i][p]];
                    if (j-dy+1 == eq[i][p])
                        p++;
                }
                eq1[i][1] = 1;
                p1=1;
                u1=1;
                for (j=2; j<=Y; j++)
                {
                    while (p1<=u1 && b1[i][j]>b1[i][eq1[i][u1]])
                        u1--;
                    eq1[i][++u1] = j;
                    if (j>=dy)
                        rmax[i][j] = b1[i][eq1[i][p1]];
                    if (j-dy+1 == eq1[i][p1])
                        p1++;
                }
            }
            for (i=dx; i<=X; i++)
                for (j=dy; j<=Y; j++)
                    if (rmax[i][j]-rmin[i][j]<min)
                    {
                        min = rmax[i][j]-rmin[i][j];
                        nr = 1;
                    }
                    else if (rmax[i][j]-rmin[i][j]==min)
                        nr++;
        }
        fprintf(g,"%d %d\n",min,nr);
    }
    fclose(f);
    fclose(g);
    return 0;