Cod sursa(job #1076889)

Utilizator IoannaPandele Ioana Ioanna Data 10 ianuarie 2014 18:15:40
Problema Struti Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 2.39 kb
#include <fstream>
#define NMAX 1002
using namespace std;

int a[NMAX][NMAX];
int minim[NMAX][NMAX];
int maxim[NMAX][NMAX];
int n, m, p, dif, nr;

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

void read() {
    in>>n>>m>>p;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            in>>a[i][j];
        }
    }
}

void solve(int dx, int dy) {
    int dmin[NMAX];
    int dmax[NMAX];

    int stMin, stMax, drMin, drMax;

    for (int i = 0; i < n; i++) {
        stMin = stMax = 0;
        drMin = drMax = -1;
        for (int j = 0; j < m; j++) {
            if (j - dmin[stMin] == dx)
                stMin++;

            while (stMin <= drMin && a[i][j] <= a[i][dmin[drMin]])
                drMin--;
            dmin[++drMin] = j;

            if (j >= dx - 1) {
                minim[i][j] = a[i][dmin[stMin]];
            }

            if (j - dmax[stMax] == dx)
                stMax++;

            while (stMax <= drMax && a[i][j] >= a[i][dmax[drMax]])
                drMax--;
            dmax[++drMax] = j;

            if (j >= dx - 1) {
                maxim[i][j] = a[i][dmax[stMax]];
            }


        }
    }

    for (int j = dx - 1; j < m; j++) {
        stMin = stMax = 0;
        drMin = drMax = -1;
        for (int i = 0; i < n; i++) {
            if (i - dmin[stMin] == dy)
                stMin++;

            while (stMin <= drMin && minim[i][j] <= minim[dmin[drMin]][j])
                drMin--;

            dmin[++drMin] = i;

            if (i - dmax[stMax] == dy)
                stMax++;

            while (stMax<=drMax && maxim[i][j] >= maxim[dmax[drMax]][j])
                drMax--;
            dmax[++drMax] = i;

            if (i >= dy - 1) {
                if (dif > maxim[dmax[stMax]][j] - minim[dmin[stMin]][j]) {
                    dif = maxim[dmax[stMax]][j] - minim[dmin[stMin]][j];
                    nr = 1;
                } else {
                    if (dif == maxim[dmax[stMax]][j] - minim[dmin[stMin]][j])
                        nr++;
                }
            }
        }
    }
}

int main() {
    int dx,dy;
    read();
    for (int i = 1; i <= p; i++) {
        in>>dx>>dy;
        dif = 8000;
        nr = 0;

        solve(dx,dy);
        if (dx != dy)
            solve(dy, dx);

        out<<dif<<" " <<nr<<"\n";
    }
    return 0;
}