Cod sursa(job #1496255)

Utilizator akaprosAna Kapros akapros Data 4 octombrie 2015 17:34:35
Problema Struti Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.16 kb
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<deque>
#define Nmax 1005
using namespace std;
int n, m, nr, t, dx, dy, sol;
int a[Nmax][Nmax];
int d[Nmax][Nmax], e[Nmax][Nmax];
deque < int > dc,ec;
void read()
{
    int i, j;
    for (i = 1; i <= n; ++ i)
        for (j = 1; j <= m; ++ j)
            scanf("%d", &a[i][j]);
}
void solve (int dx,int dy)
{
    int i, j, p, q;
    dc.clear();
    ec.clear();

    for (i = 1; i <= n; ++ i)
    {
        dc.clear();
        ec.clear();
        for (j = 1; j <= m; ++ j)
        {
            while (!dc.empty() && a[i][dc.back()]>a[i][j])
                dc.pop_back();
            dc.push_back(j);
            if (j-dc.front()==dx) dc.pop_front();
            d[i][j]=dc.front();

            while (!ec.empty() && a[i][ec.back()]<a[i][j])
                ec.pop_back();
            ec.push_back(j);
            if (j-ec.front()==dx) ec.pop_front();
            e[i][j]=ec.front();
        }
    }
    dc.clear();
    ec.clear();

    for (j = 1; j <= m; ++ j)
    {
        dc.clear();
        ec.clear();
        for (i=1; i<=n; i++)
        {
            while (!dc.empty() && a[dc.back()][d[dc.back()][j]]>a[i][d[i][j]])
                dc.pop_back();
            dc.push_back(i);
            if (i-dc.front()==dy) dc.pop_front();
            while (!ec.empty() && a[ec.back()][e[ec.back()][j]]<=a[i][e[i][j]])
                ec.pop_back();
            ec.push_back(i);
            if (i-ec.front()==dy) ec.pop_front();
            if (i>=dy && j>=dx)
            {
                p=a[ec.front()][e[ec.front()][j]];
                q=a[dc.front()][d[dc.front()][j]];
                if (p-q<sol)
                    sol=p-q,nr=1;
                else if (p-q==sol)
                    ++nr;
            }
        }
    }
}
int main()
{
    freopen("struti.in","r",stdin);
    freopen("struti.out","w",stdout);
    scanf("%d %d %d",&n,&m,&t);
    t++;
    read();
    while (--t)
    {
        scanf("%d %d",&dx,&dy);
        sol=2000000000;
        solve(dx,dy);
        if (dy!=dx) solve(dy,dx);
        printf("%d %d\n",sol,nr);
    }
    return 0;
}