Cod sursa(job #2096841)

Utilizator FlorinHajaFlorin Gabriel Haja FlorinHaja Data 29 decembrie 2017 21:29:25
Problema Struti Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.31 kb
#include <fstream>

using namespace std;

ifstream f("struti.in");
ofstream g("struti.out");

const int nmax = 1005;

int stlm[nmax], drlm[nmax], dqlinm[nmax][nmax];
int stlM[nmax], drlM[nmax], dqlinM[nmax][nmax];
int stcm, drcm, dqcm[nmax];
int stcM, drcM, dqcM[nmax];
int am[nmax][nmax], aM[nmax][nmax];
int n, m, a[nmax][nmax], q, i, j, x, y, z;

inline int mai_mic(int a, int b) {
    return a <= b;
}

inline int mai_mare(int a, int b) {
    return a >= b;
}

int use_deque(int *a, int x, int width, int current, int *dq, int &st, int &dr,
              int (*f)(int, int)) {

    while (( (*f)(a[current], a[dq[dr]]) == 1) && st <= dr) dr--;
    dq[++dr] = current;
    if (current-dq[st]+1 > width)
        st++;
    return a[dq[st]];
}

int query(int pas, int x, int y, int &nsol) {
    int i, j, km, lm, kM, lM;
    int minim = 1e9, cnt = 0;

    for (i = 1; i <= n; i++)
        stlm[i] = stlM[i] = 1, drlm[i] = drlM[i] = 0;

    for (j = 1; j <= m; j++) {
        stcm = stcM = 1, drcm = drcM = 0;
        for (i = 1; i <= n; i++) {
            km = use_deque( a[i], a[i][j], y, j, dqlinm[i], stlm[i], drlm[i], mai_mic);
            kM = use_deque( a[i], a[i][j], y, j, dqlinM[i], stlM[i], drlM[i], mai_mare);
            am[j][i] = km;
            aM[j][i] = kM;
            if (j >= y) {
                lm = use_deque(am[j],      km, x, i,      dqcm,    stcm,    drcm, mai_mic);
                lM = use_deque(aM[j],      kM, x, i,      dqcM,    stcM,    drcM, mai_mare);
            }

            if (i >= x && j >= y) {
                if (lM-lm < minim)
                    minim = lM-lm, cnt = 1;
                else if (lM-lm == minim)
                    cnt++;
            }
        }
    }
    for (i = 1; i <= n; i++)
        stlm[i] = stlM[i] = 1, drlm[i] = drlM[i] = 0;

    if (x != y) {
        for (j = 1; j <= m; j++) {
            stcm = stcM = 1, drcm = drcM = 0;
            for (i = 1; i <= n; i++) {
                km = use_deque( a[i], a[i][j], x, j, dqlinm[i], stlm[i], drlm[i], mai_mic);
                kM = use_deque( a[i], a[i][j], x, j, dqlinM[i], stlM[i], drlM[i], mai_mare);
                am[j][i] = km;
                aM[j][i] = kM;
                if (j >= x) {
                    lm = use_deque(am[j],      km, y, i,      dqcm,    stcm,    drcm, mai_mic);
                    lM = use_deque(aM[j],      kM, y, i,      dqcM,    stcM,    drcM, mai_mare);
                }

                if (i >= y && j >= x) {
                    if (lM-lm < minim)
                        minim = lM-lm, cnt = 1;
                    else if (lM-lm == minim)
                        cnt++;
                }
            }
        }
    }
    nsol = cnt;
    return minim;
}

void parse() {
    f.get();

    char s[6005], *k;
    int i, nr = 0;
    for (i = 1; i <= n; i++) {
        f.getline(s, sizeof(s));
        k = s;
        for (j = 1; j <= m; j++) {
            nr = 0;
            while (*k >= '0' && *k <= '9')
                nr = nr*10 + *k - '0', k++;
            a[i][j] = nr;
            while (*k == ' ') k++;
        }
    }
}

int main() {
    f >> n >> m >> q;
    parse();

    for (i = 1; i <= q; i++) {
        f >> x >> y;
        g << query(i,x,y,z);
        g << ' ' << z << '\n';
    }
    return 0;
}