Cod sursa(job #1496262)

Utilizator akaprosAna Kapros akapros Data 4 octombrie 2015 17:42:28
Problema Struti Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.08 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <deque>
#define inf 2000000000
#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];
class InputReader
{
public:
    InputReader() {}
    InputReader(const char *file_name)
    {
        input_file = fopen(file_name, "r");
        cursor = 0;
        fread(buffer, SIZE, 1, input_file);
    }
    inline InputReader &operator >>(int &n)
    {
        while(buffer[cursor] < '0' || buffer[cursor] > '9')
        {
            advance();
        }
        n = 0;
        while('0' <= buffer[cursor] && buffer[cursor] <= '9')
        {
            n = n * 10 + buffer[cursor] - '0';
            advance();
        }
        return *this;
    }
private:
    FILE *input_file;
    static const int SIZE = 1 << 17;
    int cursor;
    char buffer[SIZE];
    inline void advance()
    {
        ++ cursor;
        if(cursor == SIZE)
        {
            cursor = 0;
            fread(buffer, SIZE, 1, input_file);
        }
    }
};

void solve (int dx,int dy)
{
    int i,j,p,q;
    deque < int >dc,ec,dl,el;
    dc.clear(); dl.clear();
    ec.clear(); el.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();
            }
        }
        dl.clear(); el.clear();
        for (j=1;j<=m;j++)
        {
            dl.clear(); el.clear();
        for (i=1;i<=n;i++)
        {
            while (!dl.empty() && a[dl.back()][d[dl.back()][j]]>a[i][d[i][j]])
            dl.pop_back();
            dl.push_back(i);
            if (i-dl.front()==dy) dl.pop_front();
            while (!el.empty() && a[el.back()][e[el.back()][j]]<=a[i][e[i][j]])
            el.pop_back();
            el.push_back(i);
            if (i-el.front()==dy) el.pop_front();
            if (i>=dy && j>=dx)
            {
                p=a[el.front()][e[el.front()][j]];
                q=a[dl.front()][d[dl.front()][j]];
                if (p-q<sol)
                sol=p-q,nr=1; else
                if (p-q==sol)
                ++nr;
            }
        }
        }
}

void rsw()
{
    int i, j;
    InputReader cin("struti.in");
    freopen("struti.out","w",stdout);
    cin >> n >> m >> t;
    ++ t;
    for (i = 1; i <= n; ++ i)
        for (j = 1; j <= m; ++ j)
            cin >> a[i][j];

    while (-- t)
    {
        cin >> dx >> dy;
        sol = inf;
        solve(dx,dy);
        if (dy != dx)
            solve(dy,dx);
        printf("%d %d\n",sol,nr);
    }
}
int main()
{
    rsw();
    return 0;
}