Cod sursa(job #3178224)

Utilizator luc3lexaAlexandrescu Luca luc3lexa Data 1 decembrie 2023 13:48:52
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.4 kb
#include <iostream>
#include <bits/stdc++.h>
#include <fstream>
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
deque<int> dq;
int n,m,p,x,y;
int a[1010][1010],s[1010][1010],minv[1010][1010];
int maxv[1010][1010];
// trebuie sa gasim min si max din fiecare dreptunghi dx dy
// facem un alg de tip sliding window cu deque pentru fiecare
// coloana si dupa folosim valorile din aux pentru a face acelasi
// lucru pe lini;
void valmin(int dx,int dy,int N,int M){
    for(int j = 1; j <=m; j++){
        for(int i = 1; i <=n; i++){
            if(!dq.empty() && dq.front() == i-dx){
                dq.pop_front();
            };
            while(!dq.empty() && a[dq.back()][j] >= a[i][j]){
                dq.pop_back();
            };
            dq.push_back(i);
            s[i-dx+1][j] = a[dq.front()][j];
        };
       while (!dq.empty()){
        dq.pop_back();
       }
    };
    for(int i = 1; i <= n-dx+1; i++){
        for(int j = 1; j <=m; j++){
            if(!dq.empty() && dq.front() == j-dy){
                dq.pop_front();
            };
            while(!dq.empty() && s[i][dq.back()] >= s[i][j]){
                dq.pop_back();
            };
            dq.push_back(j);
            minv[i][j-dy+1] = s[i][dq.front()];
        };
        while(!dq.empty()){
            dq.pop_back();
        }
    }
};
void valmax(int dx,int dy,int n,int m){
    for(int j = 1; j <=m; j++){
        for(int i = 1; i <=n; i++){
            if(!dq.empty() && dq.front() == i-dx){
                dq.pop_front();
            };
            while(!dq.empty() && a[dq.back()][j] <= a[i][j]){
                dq.pop_back();
            };
            dq.push_back(i);
            s[i-dx+1][j] = a[dq.front()][j];
        };
       while (!dq.empty()){
        dq.pop_back();
       }
    };
    for(int i = 1; i <= n-dx+1; i++){
        for(int j = 1; j <=m; j++){
            if(!dq.empty() && dq.front() == j-dy){
                dq.pop_front();
            };
            while(!dq.empty() && s[i][dq.back()] <= s[i][j]){
                dq.pop_back();
            };
            dq.push_back(j);
            maxv[i][j-dy+1] = s[i][dq.front()];
        };
        while(!dq.empty()){
            dq.pop_back();
        }
    }
}
int main()
{
    fin >> n >> m >> p;
    for(int i = 1; i <=n; i++){
        for(int j = 1; j <=m; j++){
            fin >> a[i][j];
        }
    };

    while(p--){
        fin >> x >> y;
        int diff = 10000;
        int c = 0;
        valmin(x,y,n,m);
        valmax(x,y,n,m);
        for(int i = 1; i <= n-x+1; i++){
            for(int j = 1; j <= m-y+1; j++){
               if(maxv[i][j]-minv[i][j] < diff){
                diff = maxv[i][j]-minv[i][j];
                c = 1;
               }else if(maxv[i][j]-minv[i][j] == diff){
                   c++;
               }
            }
        };
        if(x!=y){
        valmin(y,x,n,m);
        valmax(y,x,n,m);
        for(int i = 1; i <= n-y+1; i++){
            for(int j = 1; j <= m-x+1; j++){
               if(maxv[i][j]-minv[i][j] < diff){
                diff = maxv[i][j]-minv[i][j];
                c = 1;
               }else if(maxv[i][j]-minv[i][j] == diff){
                   c++;
               }
            }
        };
        }
        fout << diff << " " << c;
        fout << '\n';
    };
    return 0;
}