Cod sursa(job #3366906)

Utilizator rosaaaRosa Elen S. rosaaa Data 5 octombrie 2026 11:12:01
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.25 kb
#include <fstream>
#include <deque>
using namespace std;

ifstream cin("struti.in");
ofstream cout("struti.out");
using ll= long long;
const int dim= 1e3+ 5;
int a[dim][dim], mini[dim][dim], maxi[dim][dim];
int mini1[dim][dim], maxi1[dim][dim];
deque <int> d;

void da_mini(int poz, int n, int k){
    int i, j;
    for(i= 1;i <= k;i++){
        while(!d.empty() and a[poz][d.back()] > a[poz][i])
            d.pop_back();
        d.push_back(i);
    }
    mini[poz][k]= a[poz][d.front()];

    for(i= k+ 1;i <= n;i++){
        while(!d.empty() and d.front() <= i- k)
            d.pop_front();
        while(!d.empty() and a[poz][d.back()] > a[poz][i])
            d.pop_back();
        //cout << "help 1.1"<< endl;
        d.push_back(i);
        mini[poz][i]= a[poz][d.front()];
    }
}

void da_maxi(int poz, int n, int k){
    int i, j;
    for(i= 1;i <= k;i++){
        while(!d.empty() and a[poz][d.back()] < a[poz][i])
            d.pop_back();
        d.push_back(i);
    }
    maxi[poz][k]= a[poz][d.front()];

    for(i= k+ 1;i <= n;i++){
        while(!d.empty() and d.front() <= i- k)
            d.pop_front();
        while(!d.empty() and a[poz][d.back()] < a[poz][i])
            d.pop_back();
        d.push_back(i);
        maxi[poz][i]= a[poz][d.front()];
    }
}

void da_mini1(int poz, int n, int k){
    int i, j;
    for(i= 1;i <= k;i++){
        while(!d.empty() and mini[d.back()][poz] > mini[i][poz])
            d.pop_back();
        d.push_back(i);
    }
    mini1[k][poz]= mini[d.front()][poz];

    for(i= k+ 1;i <= n;i++){
        while(!d.empty() and d.front() <= i- k)
            d.pop_front();
        while(!d.empty() and mini[d.back()][poz] > mini[i][poz])
            d.pop_back();

        d.push_back(i);
        mini1[i][poz]= mini[d.front()][poz];
    }
}

void da_maxi1(int poz, int n, int k){
    int i, j;
    for(i= 1;i <= k;i++){
        while(!d.empty() and maxi[d.back()][poz] < maxi[i][poz])
            d.pop_back();
        d.push_back(i);
    }
    maxi1[k][poz]= maxi[d.front()][poz];

    for(i= k+ 1;i <= n;i++){
        while(!d.empty() and d.front() <= i- k)
            d.pop_front();
        while(!d.empty() and maxi[d.back()][poz] < maxi[i][poz])
            d.pop_back();

        d.push_back(i);
        maxi1[i][poz]= maxi[d.front()][poz];
    }
}

void afis(int n, int m){
    int i, j;
    for(i= 1;i <= n;i++){
        for(j= 1;j <= m;j++)
            cout << mini[i][j]<<" ";
        cout << endl;
    }
    cout << endl;
    for(i= 1;i <= n;i++){
        for(j= 1;j <= m;j++)
            cout << maxi[i][j]<<" ";
        cout << endl;
    }
    cout << endl;
}

void afis1(int n, int m){
    int i, j;
    for(i= 1;i <= n;i++){
        for(j= 1;j <= m;j++)
            cout << mini1[i][j]<<" ";
        cout << endl;
    }
    cout << endl;
    for(i= 1;i <= n;i++){
        for(j= 1;j <= m;j++)
            cout << maxi1[i][j]<<" ";
        cout << endl;
    }
    cout << endl;
}

int main()
{
    int n, m, t, i, j, h, w;
    cin >> n>> m>> t;

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

    while(t--){
        cin >> h>> w;
        int minn= 1e9, cnt= 0;

        for(int hk= 1;hk <= 2;hk++){
            for(i= 1;i <= n;i++){
                da_mini(i, m, w);
                while(!d.empty())d.pop_back();
                da_maxi(i, m, w);
                while(!d.empty())d.pop_back();
            }
            //afis(n, m);

            for(j= 1;j <= m;j++){
                da_mini1(j, n, h);
                while(!d.empty())d.pop_back();
                da_maxi1(j, n, h);
                while(!d.empty())d.pop_back();
            }

            //afis1(n, m);

            for(i= h;i <= n;i++)
                for(j= w;j <= m;j++){
                    int nr= maxi1[i][j]- mini1[i][j];
                    if(minn > nr){
                        minn= nr;
                        cnt= 1;
                    }
                    else
                    if(minn== nr)cnt++;
                }
            swap(h, w);
            if(h== w){
                break;
            }
        }

        cout << minn<<" "<< cnt<<'\n';
    }


    return 0;
}