Cod sursa(job #2895173)

Utilizator antonio_sefu_tauLaslau Antonio antonio_sefu_tau Data 28 aprilie 2022 19:54:45
Problema Struti Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.62 kb
#include <iostream>
#include <fstream>
#include <deque>
#include <climits>

using namespace std;

const int dim = 1e3 + 5;
int a[dim][dim], maxx[dim][dim], minn[dim][dim], min_sol = INT_MAX, nr;
int n, m, q;

deque<int> dqmin, dqmax;

void first_pos(int A, int B){
    for(int j = 1; j <= m; j++){
        dqmax.clear();
        dqmin.clear();
        for(int i = 1; i <= n; i++){
            while(!dqmax.empty() and a[dqmax.back()][j] <= a[i][j]){
                dqmax.pop_back();
            }
            while(!dqmin.empty() and a[dqmin.back()][j] >= a[i][j]){
                dqmin.pop_back();
            }
            dqmax.push_back(i);
            dqmin.push_back(i);
            if(dqmax.front() <= i - A){
                dqmax.pop_front();
            }
            if(dqmin.front() <= i - A){
                dqmin.pop_front();
            }
            if(i >= A){
                maxx[i][j] = a[dqmax.front()][j];
                minn[i][j] = a[dqmin.front()][j];
            }
        }
    }
}

void second_pos(int A, int B){
    for(int i = A; i <= n; i++){
        dqmin.clear();
        dqmax.clear();
        for(int j = 1; j <= m; j++){
            while(!dqmax.empty() and maxx[i][dqmax.back()] <= maxx[i][j]){
                dqmax.pop_back();
            }
            while(!dqmin.empty() and minn[i][dqmin.back()] >= minn[i][j]){
                dqmin.pop_back();
            }
            dqmax.push_back(j);
            dqmin.push_back(j);
            if(dqmax.front() <= j - B){
                dqmax.pop_front();
            }
            if(dqmin.front() <= j - B){
                dqmin.pop_front();
            }
            if(j >= B and maxx[i][dqmax.front()] - minn[i][dqmin.front()] < min_sol){
                min_sol = maxx[i][dqmax.front()] - minn[i][dqmin.front()];
                nr = 1;
            }
            else
            if(j >= B and maxx[i][dqmax.front()] - minn[i][dqmin.front()] == min_sol){
                nr++;
            }
        }
    }
}

int main(){
    ios_base :: sync_with_stdio(false);
    cin.tie(0);
    ifstream cin("struti.in");
    ofstream cout("struti.out");
    cin >> n >> m >> q;
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m; j++){
            cin >> a[i][j];
        }
    }
    while(q--){
        int A, B;
        cin >> A >> B;
        nr = 0, min_sol = INT_MAX;
        first_pos(A, B);
        second_pos(A, B);
        if(A != B){
            first_pos(A, B);
            second_pos(A, B);
        }
        cout << min_sol << ' ' << nr << endl;
    }
    return 0;
}
//MBVM MOVTM