Cod sursa(job #1729044)

Utilizator moise_alexandruMoise Alexandru moise_alexandru Data 14 iulie 2016 01:23:04
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.71 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <deque>
using namespace std;
ifstream in("struti.in");
ofstream out("struti.out");
const int maxn = 1005;
int minim[maxn][maxn];
int maxim[maxn][maxn];
int M[maxn][maxn];
deque <int> dqmin;
deque <int> dqmax;
int m, n;

pair <int, int> solve(int lin, int col)
{
    memset(minim, 0, sizeof minim);
    memset(maxim, 0, sizeof maxim);
    for(int p = 1; p <= m; p++)
    {
        dqmin.clear();
        dqmax.clear();
        int k = col;
        for(int i = 1; i < k; i++)
        {
            while(!dqmin.empty() && M[p][dqmin.back()] >= M[p][i])
                dqmin.pop_back();
            dqmin.push_back(i);
        }
        for(int i = k; i <= n; i++)
        {
            while(!dqmin.empty() && M[p][dqmin.back()] >= M[p][i])
                dqmin.pop_back();
            dqmin.push_back(i);
            if(dqmin.front() <= i - k)
                dqmin.pop_front();
            minim[p][i - k + 1] = M[p][dqmin.front()];
        }

        for(int i = 1; i < k; i++)
        {
            while(!dqmax.empty() && M[p][dqmax.back()] <= M[p][i])
                dqmax.pop_back();
            dqmax.push_back(i);
        }
        for(int i = k; i <= n; i++)
        {
            while(!dqmax.empty() && M[p][dqmax.back()] <= M[p][i])
                dqmax.pop_back();
            dqmax.push_back(i);
            if(dqmax.front() <= i - k)
                dqmax.pop_front();
            maxim[p][i - k + 1] = M[p][dqmax.front()];
        }
    }

    dqmin.clear();
    dqmax.clear();

    int mn = (1 << 30);
    int nr = 0;
    int k = lin;
    for(int j = 1; j <= n - col + 1; j++)
    {
        dqmin.clear();
        dqmax.clear();
        for(int i = 1; i < k; i++)
        {
            while(!dqmin.empty() && minim[dqmin.back()][j] >= minim[i][j])
                dqmin.pop_back();
            dqmin.push_back(i);
        }
        for(int i = 1; i < k; i++)
        {
            while(!dqmax.empty() && maxim[dqmax.back()][j] <= maxim[i][j])
                dqmax.pop_back();
            dqmax.push_back(i);
        }
        for(int i = k; i <= m; i++)
        {
            while(!dqmin.empty() && minim[dqmin.back()][j] >= minim[i][j])
                dqmin.pop_back();
            dqmin.push_back(i);
            if(dqmin.front() <= i - k)
                dqmin.pop_front();

            while(!dqmax.empty() && maxim[dqmax.back()][j] <= maxim[i][j])
                dqmax.pop_back();
            dqmax.push_back(i);
            if(dqmax.front() <= i - k)
                dqmax.pop_front();

            if(mn > maxim[dqmax.front()][j] - minim[dqmin.front()][j])
            {
                mn = maxim[dqmax.front()][j] - minim[dqmin.front()][j];
                nr = 0;
            }
            if(mn == maxim[dqmax.front()][j] - minim[dqmin.front()][j])
                nr++;
        }
    }
    return make_pair(mn, nr);
}

int main()
{
    int p;
    in >> m >> n >> p;
    for(int i = 1; i <= m; i++)
        for(int j = 1; j <= n; j++)
            in >> M[i][j];
    for(int i = 1; i <= p; i++)
    {
        int x, y;
        in >> x >> y;
        pair <int, int> aux1 = solve(x, y);
        pair <int, int> aux2 = solve(y, x);
        if(x == y)
            out << aux1.first << " " << aux2.second;
        else
        {
            if(aux1.first == aux2.first)
                out << aux1.first << " " << aux1.second + aux2.second;
            else if(aux1.first < aux2.first)
                out << aux1.first << " " << aux1.second;
            else
                out << aux2.first << " " << aux2.second;
        }
        out << "\n";
    }
    return 0;
}