Cod sursa(job #2763620)

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

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

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( ) {
    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, 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 ) {
                deque <int> dmin2, dmax2;

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