Cod sursa(job #2762587)

Utilizator MagnvsDaniel Constantin Anghel Magnvs Data 8 iulie 2021 15:57:15
Problema Struti Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.13 kb
#include <fstream>
#include <queue>

using namespace std;

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

const int nmax = 1000, mmax = 1000, xmax = 8000;

int v[nmax+1][mmax+1];

deque <int> dmin[mmax+1], dmax[mmax+1];
deque <int> dmin2, dmax2;

int main( ) {
    int n, m, t;
    fin >> n >> m >> t;
    for ( int i = 1; i <= n; ++ i ) {
        for ( int j = 1; j <= m ; ++ j ) {
            fin >> v[i][j];
        }
    }

    for ( int it = 1; it <= t; ++ it ) {
        int x, y;
        fin >> x >> y;
        int sol = xmax, sol2 = 0, ie;
        if ( x != y ) {
            ie = 0;
        } else {
            ie = 1;
        }
        while ( ie < 2 ) {
            for ( int j = 1; j <= m; ++ j ) {
                dmin[j].resize(0);
                dmax[j].resize(0);
            }

            for ( int i = 1; i <= n; ++ i ) {
                dmin2.resize(0);
                dmax2.resize(0);

                for ( int j = 1; j <= m; ++ j) {
                    while ( dmin[j].empty() == 0 && v[dmin[j].back()][j] > v[i][j] ) {
                        dmin[j].pop_back();
                    }
                    dmin[j].push_back(i);
                    if ( dmin[j].front() <= i-x ) {
                        dmin[j].pop_front();
                    }

                    while ( dmax[j].empty() == 0 && v[dmax[j].back()][j] < v[i][j] ) {
                        dmax[j].pop_back();
                    }
                    dmax[j].push_back(i);
                    if ( dmax[j].front() <= i-x ) {
                        dmax[j].pop_front();
                    }

                    if ( i >= x ) {
                        while ( dmin2.empty() == 0 && v[dmin[dmin2.back()].front()][dmin2.back()] > v[dmin[j].front()][j] ) {
                            dmin2.pop_back();
                        }
                        dmin2.push_back(j);
                        if ( dmin2.front() <= j-y ) {
                            dmin2.pop_front();
                        }

                        while ( dmax2.empty() == 0 && v[dmax[dmax2.back()].front()][dmax2.back()] < v[dmax[j].front()][j] ) {
                            dmax2.pop_back();
                        }
                        dmax2.push_back(j);
                        if ( dmax2.front() <= j-y ) {
                            dmax2.pop_front();
                        }

                        if ( j >= y ) {
                            int vmin = v[dmin[dmin2.front()].front()][dmin2.front()];
                            int vmax = v[dmax[dmax2.front()].front()][dmax2.front()];

                            if ( vmax-vmin < sol ) {
                                sol = vmax-vmin;
                                sol2 = 1;
                            } else if ( vmax-vmin == sol ) {
                                ++ sol2;
                            }
                        }
                    }
                }
            }

            ++ie;
            int aux = x;
            x = y;
            y = aux;
        }

        fout << sol << " " << sol2 << "\n";
    }

    return 0;
}