Cod sursa(job #2052833)

Utilizator lucametehauDart Monkey lucametehau Data 31 octombrie 2017 08:37:36
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.71 kb
#include <fstream>
#include <deque>

using namespace std;

ifstream cin("struti.in");
ofstream cout("struti.out");

const int N_MAX = 1000;
const int M_MAX = 1000;
const int INF = 1e9;

int n, m, q;
int sol;
int dx, dy;
pair <int, int> a, b;

deque <pair <int, int> > dq,deq;
int v[1 + N_MAX][1 + M_MAX];
int solmin[1 + N_MAX][1 + M_MAX];
int solmax[1 + N_MAX][1 + M_MAX];

pair <int, int> CalcMinim(int dx, int dy)
{
    int sol = INF, ap;
    for(int i = 1; i <= n; i++)
    {
        dq.clear(); deq.clear();
        for(int j = 1; j <= m; j++)
        {
            while(dq.empty() == 0 && dq.back().first >= v[i][j])
                dq.pop_back();
            dq.push_back({v[i][j], j});
            if(dq.front().second <= (j - dx))
                dq.pop_front();
            while(deq.empty() == 0 && deq.back().first <= v[i][j])
                deq.pop_back();
            deq.push_back({v[i][j], j});
            if(deq.front().second <= (j - dx))
                deq.pop_front();
            if(j < dx)
            {
                solmin[i][j] = INF;
                solmax[i][j] = -INF;
            }
            else
            {
                solmin[i][j] = dq.front().first;
                solmax[i][j] = deq.front().first;
            }
        }
    }
    for(int j = dx; j <= m; j++)
    {
        dq.clear(); deq.clear();
        for(int i = 1; i <= n; i++)
        {
            while(dq.empty() == 0 && dq.back().first >= solmin[i][j])
                dq.pop_back();
            dq.push_back({solmin[i][j], i});
            if(dq.front().second <= (i - dy))
                dq.pop_front();
            while(deq.empty() == 0 && deq.back().first <= solmax[i][j])
                deq.pop_back();
            deq.push_back({solmax[i][j], i});
            if(deq.front().second <= (i - dy))
                deq.pop_front();
            if(i >= dy)
            {
                if(deq.front().first - dq.front().first < sol)
                {
                    sol = deq.front().first - dq.front().first;
                    ap = 1;
                }
                else if(deq.front().first - dq.front().first == sol)
                    ap++;
            }
        }
    }
    return {sol, ap};
}

int main()
{
    cin >> n >> m >> q;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            cin >> v[i][j];
    for(; q; q--)
    {
        cin >> dx >> dy;
        a = CalcMinim(dx, dy);
        b = CalcMinim(dy, dx);
        if(a.first > b.first)
            swap(a, b);
        if(a.first == b.first && dx != dy)
            a.second += b.second;
        cout << a.first << " " << a.second << "\n";
    }
    return 0;
}