Cod sursa(job #2208949)

Utilizator ContDeRacistAliniateEBlat ContDeRacist Data 1 iunie 2018 12:36:19
Problema Struti Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.27 kb
#include <fstream>
#include <algorithm>
using namespace std;

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

const short int N = 1007;

short int v[N][N], mini[N][N], maxi[N][N], lini[N][N], dq[N], n, m;

pair < short int, int > f(short int x, short int y) {
    short int st, dr, diferenta(8e3);
    int ap(0);
    for (int i = 1; i <= n; ++i) {
        st = 0; dr = -1;
        for (int j = 1; j <= m; ++j) {
            while (st <= dr && dq[st] <= j - x) {
                ++st;
            }
            while (st <= dr && v[i][dq[dr]] >= v[i][j]) {
                --dr;
            }
            dq[++dr] = j;
            if (j >= x) {
                lini[i][j - x + 1] = v[i][dq[st]];
            }
        }
    }
    for (int j = 1; j <= m - x + 1; ++j) {
        st = 0;
        dr = -1;
        for (int i = 1; i <= n; ++i) {
            while (st <= dr && dq[st] <= i - y) {
                ++st;
            }
            while (st <= dr && lini[dq[dr]][j] >= lini[i][j]) {
                --dr;
            }
            dq[++dr] = i;
            if (i >= y) {
                mini[i - y + 1][j] = lini[dq[st]][j];
            }
        }
    }
    for (int i = 1; i <= n; ++i) {
        st = 0; dr = -1;
        for (int j = 1; j <= m; ++j) {
            while (st <= dr && dq[st] == j - x) {
                ++st;
            }
            while (st <= dr && v[i][dq[dr]] <= v[i][j]) {
                --dr;
            }
            dq[++dr] = j;
            if (j >= x) {
                lini[i][j - x + 1] = v[i][dq[st]];
            }
        }
    }
    for (int j = 1; j <= m - x + 1; ++j) {
        st = 0;
        dr = -1;
        for (int i = 1; i <= n; ++i) {
            while (st <= dr && dq[st] == i - y) {
                ++st;
            }
            while (st <= dr && lini[dq[dr]][j] <= lini[i][j]) {
                --dr;
            }
            dq[++dr] = i;
            if (i >= y) {
                if (lini[dq[st]][j] - mini[i - y + 1][j] < diferenta) {
                    diferenta = lini[dq[st]][j] - mini[i - y + 1][j];
                    ap = 0;
                }
                if (diferenta == lini[dq[st]][j] - mini[i - y + 1][j]) {
                    ++ap;
                }
                mini[i - y + 1][j] = lini[dq[st]][j];
            }
        }
    }
    return make_pair(diferenta, ap);
}

int main()
{
    short int p, x, y;
    pair < short int, short int > var1, var2;
    cin >> n >> m >> p;
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            cin >> v[i][j];
        }
    }
    for (int i = 0; i < p; ++i) {
        cin >> x >> y;
        if (x == y) {
            var1 = f(x, y);
            cout << var1.first << " " << var1.second << "\n";
            continue;
        }
        var1 = f(x, y);
        var2 = f(y, x);
        if (var1.first == var2.first) {
            cout << var1.first << " " << var1.second + var2.second << "\n";
        }
        else {
            if (var1.first < var2.first) {
                cout << var1.first << " " << var1.second << "\n";
            }
            else {
                cout << var2.first << " " << var2.second << "\n";
            }
        }
    }
    return 0;
}