Cod sursa(job #2793336)

Utilizator MagnvsDaniel Constantin Anghel Magnvs Data 3 noiembrie 2021 14:54:58
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.87 kb
#include <fstream>
#include <queue>
#include <string>

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

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

int v[nmax+1][mmax+1], vmin[mmax+1][nmax+1], vmax[mmax+1][nmax+1];

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 ti = 1; ti <= t; ++ ti ) {
        int x, y;
        fin >> x >> y;
        int sol = xmax, sol2 = 0, i2;
        if ( x != y ) {
            i2 = 0;
        } else {
            i2 = 1;
        }
        while ( i2 < 2 ) {
            for ( int i = 1; i <= n; ++ i ) {
                std::deque <int> dmin, dmax;
                for ( int j = 1; j <= m; ++ j ) {
                    while ( dmin.empty() == 0 && v[i][dmin.back()] > v[i][j] ) {
                        dmin.pop_back();
                    }
                    dmin.push_back(j);
                    if ( dmin.front() <= j-y ) {
                        dmin.pop_front();
                    }
                    vmin[j][i] = v[i][dmin.front()];

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

            for ( int j = y; j <= m; ++ j ) {
                std::deque <int> dmin, dmax;
                for ( int i = 1; i <= n; ++ i ) {
                    while ( dmin.empty() == 0 && vmin[j][dmin.back()] > vmin[j][i] ) {
                        dmin.pop_back();
                    }
                    dmin.push_back(i);
                    if ( dmin.front() <= i-x ) {
                        dmin.pop_front();
                    }

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

                    if ( i >= x ) {
                        int aux = vmax[j][dmax.front()]-vmin[j][dmin.front()];
                        if ( sol > aux ) {
                            sol = aux;
                            sol2 = 1;
                        } else if ( sol == aux ) {
                            ++ sol2;
                        }
                    }
                }
            }

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

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

    return 0;
}