Cod sursa(job #2743142)

Utilizator As932Stanciu Andreea As932 Data 22 aprilie 2021 16:49:59
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.14 kb
#include <fstream>
#include <deque>

using namespace std;

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

const int lmax = 1e3 + 5;

int m, n, p, ans, nr, a[lmax][lmax], mnL[lmax][lmax], mxL[lmax][lmax];

void read(){
    cin >> n >> m >> p;

    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            cin >> a[i][j];
}

void solve(int x, int y){
    deque <int> mn, mx;

    for(int j = 1; j <= m; j++){
        mn.clear();
        mx.clear();

        for(int i = 1; i <= n; i++)
        {
            while(!mn.empty() && i - x >= mn.front())
                mn.pop_front();
            while(!mn.empty() && a[i][j] <= a[mn.back()][j])
                mn.pop_back();
            mn.push_back(i);

            while(!mx.empty() && i - x >= mx.front())
                mx.pop_front();
            while(!mx.empty() && a[i][j] >= a[mx.back()][j])
                mx.pop_back();
            mx.push_back(i);

            mnL[i][j] = a[mn.front()][j];
            mxL[i][j] = a[mx.front()][j];
        }
    }

    for(int i = x; i <= n; i++){
        mn.clear();
        mx.clear();

        for(int j = 1; j <= m; j++){
            while(!mn.empty() && j - y >= mn.front())
                mn.pop_front();
            while(!mn.empty() && mnL[i][j] <= mnL[i][mn.back()])
                mn.pop_back();
            mn.push_back(j);

            while(!mx.empty() && j - y >= mx.front())
                mx.pop_front();
            while(!mx.empty() && mxL[i][j] >= mxL[i][mx.back()])
                mx.pop_back();
            mx.push_back(j);

            int dif = mxL[i][mx.front()] - mnL[i][mn.front()];
            if(j >= y && dif < ans){
                ans = dif;
                nr = 1;
            } else if(j >= y && dif == ans)
                nr ++;
        }
    }
}

void queries(){
    while(p--){
        int dx, dy;
        cin >> dx >> dy;

        ans = 8001, nr = 0;
        solve(dx, dy);
        if(dx != dy)
            solve(dy, dx);

        cout << ans << " " << nr << "\n";
    }
}

int main()
{
    read();
    queries();

    return 0;
}