Cod sursa(job #1717758)

Utilizator antanaAntonia Boca antana Data 15 iunie 2016 18:39:22
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.36 kb
#include <cstdio>
#define MAX 1000
#define INF 8001
using namespace std;
struct aa{
    int x, y;
}d1[MAX+1], d2[MAX+1];
int v[MAX+1][MAX+1], n, m, a1[MAX+1][MAX+1], a2[MAX+1][MAX+1], mini, nrmin;
inline void calc(int dx, int dy)
{
    int st1, dr1, st2, dr2, s;
    for(int j=1;j<=m;++j)
    {
        st1=st2=dr1=dr2=0;
        d1[st1].x=d2[st2].x=1;
        d1[st1].y=d2[st2].y=j;
        a1[1][j]=a2[1][j]=v[1][j];
        for(int i=2;i<=n;++i)
        {
            while(d1[st1].x <= i-dx)
                st1++;
            while(v[d1[dr1].x][d1[dr1].y] <= v[i][j] && dr1 >= st1)
                dr1--;
            d1[++dr1].x=i;
            d1[dr1].y=j;
            while(d2[st2].x <= i-dx)
                st2++;
            while(v[d2[dr2].x][d2[dr2].y] >= v[i][j] && dr2 >= st2)
                dr2--;
            d2[++dr2].x=i;
            d2[dr2].y=j;
            a1[i][j]=v[d1[st1].x][d1[st1].y];
            a2[i][j]=v[d2[st2].x][d2[st2].y];
        }
    }
    for(int i=dx;i<=n;++i)
    {
        st1=dr1=st2=dr2=0;
        d1[st1].x=i;
        d1[st1].y=1;
        d2[st2].x=i;
        d2[st2].y=1;
        for(int j=2;j<=m;++j)
        {
            while(d1[st1].y <= j-dy)
                st1++;
            while(d2[st2].y <= j-dy)
                st2++;
            while(a1[d1[dr1].x][d1[dr1].y] <= a1[i][j] && dr1 >= st1)
                dr1--;
            while(a2[d2[dr2].x][d2[dr2].y] >= a2[i][j] && dr2 >= st2)
                dr2--;
            d1[++dr1].x=i;
            d1[dr1].y=j;
            d2[++dr2].x=i;
            d2[dr2].y=j;
            if(j>=dy)
            {
                s=a1[d1[st1].x][d1[st1].y] - a2[d2[st2].x][d2[st2].y];
                if( mini > s)
                {
                    mini=s;
                    nrmin=1;
                }
                else if(mini == s)
                    nrmin++;
            }
        }
    }
}
int main()
{
    freopen("struti.in", "r", stdin);
    freopen("struti.out", "w", stdout);
    int p, dx, dy;
    scanf("%d%d%d", &n, &m, &p);
    for(int i=1;i<=n;++i)
        for(int j=1;j<=m;++j)
            scanf("%d", &v[i][j]);
    for(int a=1;a<=p;++a)
    {
        scanf("%d%d", &dx, &dy);
        mini=INF;
        calc(dx, dy);
        if(dx != dy) calc(dy, dx);
        printf("%d %d\n", mini, nrmin);
    }
    return 0;
}