Cod sursa(job #2793301)

Utilizator MagnvsDaniel Constantin Anghel Magnvs Data 3 noiembrie 2021 14:04:22
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.99 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];

std::string::iterator fi;
void read( int &x ) { //non-negative only
    while ( *fi < '0' || *fi > '9' ) {
        ++ fi;
    }
    x = 0;
    while ( *fi >= '0' && *fi <= '9' ) {
        x = x*10+(*fi)-'0';
        ++ fi;
    }
}

int main( ) {
    std::string f;
    getline(fin, f, char(0));
    fi = f.begin();

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

    for ( int ti = 1; ti <= t; ++ ti ) {
        int x, y;
        read(x); read(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 <= y-1; ++ j ) {
                    while ( dmin.empty() == 0 && v[i][dmin.back()] > v[i][j] ) {
                        dmin.pop_back();
                    }
                    dmin.push_back(j);

                    while ( dmax.empty() == 0 && v[i][dmax.back()] < v[i][j] ) {
                        dmax.pop_back();
                    }
                    dmax.push_back(j);
                }
                for ( int j = y; 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 <= x-1; ++ i ) {
                    while ( dmin.empty() == 0 && vmin[j][dmin.back()] > vmin[j][i] ) {
                        dmin.pop_back();
                    }
                    dmin.push_back(i);

                    while ( dmax.empty() == 0 && vmax[j][dmax.back()] < vmax[j][i] ) {
                        dmax.pop_back();
                    }
                    dmax.push_back(i);
                }
                for ( int i = x; 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();
                    }

                    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;
}