Cod sursa(job #3333008)

Utilizator Belea_DariusBelea Mihai Darius Belea_Darius Data 10 ianuarie 2026 13:58:17
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 6.98 kb
#include <bits/stdc++.h>
#define MAXN 1000
#define MAXALT 8000
using namespace std;

ifstream fin("struti.in");
ofstream fout("struti.out");

int mat[MAXN + 1][MAXN + 1], min_lin[MAXN + 1][MAXN + 1], min_col[MAXN + 1][MAXN + 1], max_lin[MAXN + 1][MAXN + 1], max_col[MAXN + 1][MAXN + 1];

int main()
{
    int n, m, p, i, j, dim_lin, dim_col, MIN, NR, aux;

    deque <int> dq_min, dq_max;

    fin >> n >> m >> p;

    for(i = 1; i <= n; i++){
        for(j = 1; j <= m; j++){
            fin >> mat[i][j];
        }
    }

    while(p--){
        fin >> dim_lin >> dim_col;
        MIN = MAXALT + 1;
        NR = 0;

        for(i = 1; i <= n; i++){
            while(!dq_min.empty()){
                dq_min.pop_back();
            }
            while(!dq_max.empty()){
                dq_max.pop_back();
            }
            for(j = 1; j <= m; j++){
                if(!dq_min.empty() && dq_min.front() == j - dim_col){
                    dq_min.pop_front();
                }
                while(!dq_min.empty() && mat[i][dq_min.back()] >= mat[i][j]){
                    dq_min.pop_back();
                }
                dq_min.push_back(j);
                if(j >= dim_col){
                    min_lin[i][j] = mat[i][dq_min.front()];
                }

                if(!dq_max.empty() && dq_max.front() == j - dim_col){
                    dq_max.pop_front();
                }
                while(!dq_max.empty() && mat[i][dq_max.back()] <= mat[i][j]){
                    dq_max.pop_back();
                }
                dq_max.push_back(j);
                if(j >= dim_col){
                    max_lin[i][j] = mat[i][dq_max.front()];
                }
            }
        }
//        for(i = 1; i <= n; i++){
//            for(j = 1; j <= m; j++){
//                printf("%d ", max_lin[i][j]);
//            }
//            printf("\n");
//        }
//        printf("\n");
        for(j = 1; j <= m; j++){
            while(!dq_min.empty()){
                dq_min.pop_back();
            }
            while(!dq_max.empty()){
                dq_max.pop_back();
            }
            for(i = 1; i <= n; i++){
                if(!dq_min.empty() && dq_min.front() == i - dim_lin){
                    dq_min.pop_front();
                }
                while(!dq_min.empty() && min_lin[dq_min.back()][j] >= min_lin[i][j]){
                    dq_min.pop_back();
                }
                dq_min.push_back(i);
                if(i >= dim_lin){
                    min_col[i][j] = min_lin[dq_min.front()][j];
                }

                if(!dq_max.empty() && dq_max.front() == i - dim_lin){
                    dq_max.pop_front();
                }
                while(!dq_max.empty() && max_lin[dq_max.back()][j] <= max_lin[i][j]){
                    dq_max.pop_back();
                }
                dq_max.push_back(i);
                if(i >= dim_lin){
                    max_col[i][j] = max_lin[dq_max.front()][j];
                }
            }
        }

        for(i = dim_lin; i <= n; i++){
            for(j = dim_col; j <= m; j++){
                if(max_col[i][j] - min_col[i][j] < MIN){
                    MIN = max_col[i][j] - min_col[i][j];
                    NR = 1;
                }else if(max_col[i][j] - min_col[i][j] == MIN){
                    NR ++;
                }
            }
        }

//        printf("***\n");
//        for(i = 1; i <= n; i++){
//            for(j = 1; j <= m; j++){
//                printf("%d ", max_col[i][j]);
//            }
//            printf("\n");
//        }
//        printf("\n");

/// //////////////////////////////////////////////////////////

        if(dim_lin != dim_col){
            aux = dim_lin;
            dim_lin = dim_col;
            dim_col = aux;

            for(i = 1; i <= n; i++){
                while(!dq_min.empty()){
                    dq_min.pop_back();
                }
                while(!dq_max.empty()){
                    dq_max.pop_back();
                }
                for(j = 1; j <= m; j++){
                    if(!dq_min.empty() && dq_min.front() == j - dim_col){
                        dq_min.pop_front();
                    }
                    while(!dq_min.empty() && mat[i][dq_min.back()] >= mat[i][j]){
                        dq_min.pop_back();
                    }
                    dq_min.push_back(j);
                    if(j >= dim_col){
                        min_lin[i][j] = mat[i][dq_min.front()];
                    }

                    if(!dq_max.empty() && dq_max.front() == j - dim_col){
                        dq_max.pop_front();
                    }
                    while(!dq_max.empty() && mat[i][dq_max.back()] <= mat[i][j]){
                        dq_max.pop_back();
                    }
                    dq_max.push_back(j);
                    if(j >= dim_col){
                        max_lin[i][j] = mat[i][dq_max.front()];
                    }
                }
            }
    //        for(i = 1; i <= n; i++){
    //            for(j = 1; j <= m; j++){
    //                printf("%d ", max_lin[i][j]);
    //            }
    //            printf("\n");
    //        }
    //        printf("\n");
            for(j = 1; j <= m; j++){
                while(!dq_min.empty()){
                    dq_min.pop_back();
                }
                while(!dq_max.empty()){
                    dq_max.pop_back();
                }
                for(i = 1; i <= n; i++){
                    if(!dq_min.empty() && dq_min.front() == i - dim_lin){
                        dq_min.pop_front();
                    }
                    while(!dq_min.empty() && min_lin[dq_min.back()][j] >= min_lin[i][j]){
                        dq_min.pop_back();
                    }
                    dq_min.push_back(i);
                    if(i >= dim_lin){
                        min_col[i][j] = min_lin[dq_min.front()][j];
                    }

                    if(!dq_max.empty() && dq_max.front() == i - dim_lin){
                        dq_max.pop_front();
                    }
                    while(!dq_max.empty() && max_lin[dq_max.back()][j] <= max_lin[i][j]){
                        dq_max.pop_back();
                    }
                    dq_max.push_back(i);
                    if(i >= dim_lin){
                        max_col[i][j] = max_lin[dq_max.front()][j];
                    }
                }
            }

            for(i = dim_lin; i <= n; i++){
                for(j = dim_col; j <= m; j++){
                    if(max_col[i][j] - min_col[i][j] < MIN){
                        MIN = max_col[i][j] - min_col[i][j];
                        NR = 1;
                    }else if(max_col[i][j] - min_col[i][j] == MIN){
                        NR ++;
                    }
                }
            }
        }

        fout << MIN << " " << NR << "\n";
    }
    return 0;
}