Cod sursa(job #3366868)

Utilizator Iustin_Mircea2010Iustin Mircea Iustin_Mircea2010 Data 5 octombrie 2026 09:05:47
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.67 kb
#include <bits/stdc++.h>

using namespace std;

deque<int> linmax[1005];
deque<int> linmin[1005];
int v[1005][1005], n, m;

pair<int, int> check(int h, int w){
    for(int i = 1; i <= m; i++){
        while(!linmax[i].empty())
            linmax[i].pop_back();
        while(!linmin[i].empty())
            linmin[i].pop_back();
    }
    int minn = 1e9, nr = 0;
    for(int i = 1; i <= n; i++){
        deque<pair<int, int>> dqmin, dqmax;
        for(int j = 1; j <= m; j++){
            //baga in linmax
            while(!linmax[j].empty() && linmax[j].front() <= i - h) linmax[j].pop_front();
            while(!linmax[j].empty() && v[i][j] >= v[linmax[j].back()][j]) linmax[j].pop_back();
            linmax[j].push_back(i);
            // baga in linmin
            while(!linmin[j].empty() && linmin[j].front() <= i - h) linmin[j].pop_front();
            while(!linmin[j].empty() && v[i][j] <= v[linmin[j].back()][j]) linmin[j].pop_back();
            linmin[j].push_back(i);
            //baga in dqmax
            while(!dqmax.empty() && dqmax.front().first <= j - w) dqmax.pop_front();
            while(!dqmax.empty() && dqmax.back().second <= v[linmax[j].front()][j]) dqmax.pop_back();
            dqmax.push_back({j, v[linmax[j].front()][j]});
            //baga in dqmin
            while(!dqmin.empty() && dqmin.front().first <= j - w) dqmin.pop_front();
            while(!dqmin.empty() && dqmin.back().second >= v[linmin[j].front()][j]) dqmin.pop_back();
            dqmin.push_back({j, v[linmin[j].front()][j]});
            if(i >= h && j >= w){
                int maxnr = dqmax.front().second, minnr = dqmin.front().second;
                if(maxnr - minnr < minn){
                    minn = maxnr - minnr;
                    nr = 1;
                }
                else if(maxnr - minnr == minn)
                    nr++;
            }
        }
    }
    return {minn, nr};
}

int main(){

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

    int q;
    cin >> n >> m >> q;
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m; j++){
            cin >> v[i][j];
        }
    }
    while(q--){
        int h, w;
        cin >> h >> w;
        pair<int, int> ans1 = check(h, w);
        pair<int, int> ans2 = check(w, h);
        if(h == w){
            cout << ans1.first << " " << ans1.second << '\n';
            continue;
        }
        if(ans1.first == ans2.first){
            cout << ans1.first << " " << ans1.second + ans2.second << '\n';
        }
        else{
            ans1 = min(ans1, ans2);
            cout << ans1.first << " " << ans1.second << '\n';
        }
    }

    return 0;
}