Cod sursa(job #3315104)

Utilizator Grama2008Grama Andrei Teodor Grama2008 Data 12 octombrie 2025 13:39:01
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.26 kb
#include <bits/stdc++.h>

using namespace std;

const int N=1005;

int v[N][N],mn[N][N], aux[N][N], n, m, p, ans, cnt;

void solve(int x, int y){
    deque<int>q;
    //minimum
    for (int i=0;i<n;i++){
        for (int j=0;j<y;j++){
            while (!q.empty() && v[i][q.back()]>v[i][j]){
                q.pop_back();
            }
            q.push_back(j);
        }
        aux[i][0]=v[i][q.front()];
        for (int j=1;j+y-1<m;j++){
            while (!q.empty() && q.front()<j){
                q.pop_front();
            }
            while (!q.empty() && v[i][q.back()]>v[i][j+y-1]){
                q.pop_back();
            }
            q.push_back(j+y-1);
            aux[i][j]=v[i][q.front()];
        }
        while (!q.empty())q.pop_back();
    }
    for (int j=0;j+y-1<m;j++){
        for (int i=0;i<x;i++){
            while (!q.empty() && aux[q.back()][j]>aux[i][j]){
                q.pop_back();
            }
            q.push_back(i);
        }
        mn[0][j]=aux[q.front()][j];
        for (int i=1;i+x-1<n;i++){
            while (!q.empty() && q.front()<i){
                q.pop_front();
            }
            while (!q.empty() && aux[q.back()][j]>aux[i+x-1][j]){
                q.pop_back();
            }
            q.push_back(i+x-1);
            mn[i][j]=aux[q.front()][j];
        }
        while (!q.empty())q.pop_back();
    }
    for (int i=0;i<n;i++){
        for (int j=0;j<y;j++){
            while (!q.empty() && v[i][q.back()]<v[i][j]){
                q.pop_back();
            }
            q.push_back(j);
        }
        aux[i][0]=v[i][q.front()];
        for (int j=1;j+y-1<m;j++){
            while (!q.empty() && q.front()<j){
                q.pop_front();
            }
            while (!q.empty() && v[i][q.back()]<v[i][j+y-1]){
                q.pop_back();
            }
            q.push_back(j+y-1);
            aux[i][j]=v[i][q.front()];
        }
        while (!q.empty())q.pop_back();
    }
    for (int j=0;j+y-1<m;j++){
        for (int i=0;i<x;i++){
            while (!q.empty() && aux[q.back()][j]<aux[i][j]){
                q.pop_back();
            }
            q.push_back(i);
        }
        int newans=aux[q.front()][j]-mn[0][j];
        if (newans<ans){
            ans=newans;
            cnt=0;
        }
        if (newans==ans){
            cnt++;
        }
        for (int i=1;i+x-1<n;i++){
            while (!q.empty() && q.front()<i){
                q.pop_front();
            }
            while (!q.empty() && aux[q.back()][j]<aux[i+x-1][j]){
                q.pop_back();
            }
            q.push_back(i+x-1);
            newans=aux[q.front()][j]-mn[i][j];
            if (newans<ans){
                ans=newans;
                cnt=0;
            }
            if (newans==ans){
                cnt++;
            }
        }
        while (!q.empty())q.pop_back();
    }
}

int main()
{
    freopen("struti.in", "r", stdin);
    freopen("struti.out", "w", stdout);
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin>>n>>m>>p;
    for (int i=0;i<n;i++){
        for (int j=0;j<m;j++){
            cin>>v[i][j];
        }
    }
    while (p--){
        int x,y;cin>>x>>y;
        ans=1e9;
        cnt=0;
        solve(x,y);
        if (x!=y){solve(y,x);}
        cout<<ans<<' '<<cnt<<'\n';
    }
    return 0;
}