Cod sursa(job #3366882)

Utilizator iuli_morariuIuli Morariu iuli_morariu Data 5 octombrie 2026 09:54:09
Problema Struti Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.13 kb
#include <bits/stdc++.h>
#define in  fin
#define out fout

using namespace std;
const int NMAX = 1005;

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

int v[NMAX][NMAX];
int v1[NMAX][NMAX]; // pt maxim
int v2[NMAX][NMAX]; // pt minim
int n, m;

void transforma_minim_pls(int k){
    for(int j = 0; j < m; j++){
        deque<int> q;
        for(int i = 0; i < n; i++){
            while(!q.empty() && q.back() > v[i][j]) q.pop_back();
            q.push_back(v[i][j]);
            if(i >= k){
                if(!q.empty() && q.front() == v[i - k][j]) q.pop_front();
            }

            if(i >= k - 1) v1[i - k + 1][j] = q.front();
        }
    }
}

void transforma_maxim_pls(int k){
    for(int j = 0; j < m; j++){
        deque<int> q;
        for(int i = 0; i < n; i++){
            while(!q.empty() && q.back() < v[i][j]) q.pop_back();
            q.push_back(v[i][j]);
            if(i >= k){
                if(!q.empty() && q.front() == v[i - k][j]) q.pop_front();
            }

            if(i >= k - 1) v2[i - k + 1][j] = q.front();
        }
    }
}

pair<int, int> give_pls(int dx, int dy){
    int diff = INT_MAX, cnt = 0;
    for(int i = 0; i + dx - 1 < n; i++){
        deque<int> q1, q2;
        for(int j = 0; j < m; j++){
            while(!q1.empty() && q1.back() > v1[i][j]) q1.pop_back();
            q1.push_back(v1[i][j]);
            while(!q2.empty() && q2.back() < v2[i][j]) q2.pop_back();
            q2.push_back(v2[i][j]);

            if(j >= dy){
                if(!q1.empty() && q1.front() == v1[i][j - dy]) q1.pop_front();
                if(!q2.empty() && q2.front() == v2[i][j - dy]) q2.pop_front();
            }

            if(j >= dy - 1){
                int mini = -1, maxi = -1;
                if(!q1.empty()) mini = q1.front();
                if(!q2.empty()) maxi = q2.front();

                if(maxi - mini < diff){
                    diff = maxi - mini;
                    cnt = 1;
                }else if(maxi - mini == diff) cnt++;
            }
        }
    }
    return {diff, cnt};
    //out << diff << " " << cnt << '\n';
}

void reset_mat(){
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            v1[i][j] = v2[i][j] = 0;
        }
    }
}

int main()
{
    in >> n >> m;
    int p; in >> p;

    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++) in >> v[i][j];
    }

    for(int ii = 0; ii < p; ii++){
        int dx, dy; in >> dx >> dy;
        reset_mat();
        transforma_minim_pls(dx);
        transforma_maxim_pls(dx);
        pair<int, int> var1 = give_pls(dx, dy);

        swap(dx, dy);
        reset_mat();
        transforma_minim_pls(dx);
        transforma_maxim_pls(dx);
        pair<int, int> var2 = give_pls(dx, dy);

        if(dx == dy){
            var2 = {-1, -1};
        }

        if(var1.first == var2.first) out << var1.first << " " << var1.second + var2.second << '\n';
        else if(var1.first < var2.first) out << var1.first << " " << var1.second << '\n';
        else out << var2.first << " " << var2.second << '\n';
    }
    return 0;
}