Cod sursa(job #3320632)

Utilizator boboc132Boboc Teodor boboc132 Data 6 noiembrie 2025 19:32:27
Problema Struti Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.37 kb
#include <iostream>
#include <fstream>
#include <deque>
#include <vector>
using namespace std;

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

const int MAX_NR=1001;
int mat[MAX_NR][MAX_NR];

int min_final[MAX_NR][MAX_NR];
int max_final[MAX_NR][MAX_NR];

int temp_min[MAX_NR][MAX_NR];
int temp_max[MAX_NR][MAX_NR];

int m,n,p,A,B;//A=dx,B=dy;dy reprezinta lungimea ferestrei adica am o ferestra de latime A si lungime B
int min_global_diff,nr_total;

void citire(){
    in>>m>>n>>p;
    for(int i=1;i<=m;i++)
        for(int j=1;j<=n;j++)
            cin>>mat[i][j];
}

pair<int,int> proceseaza_dimensiunea(int DX,int DY){
    int N_max=n-DY+1;
    for(int i=1;i<=m;i++){
        deque<int>dq_min,dq_max;
        for(int j=1;j<=n;j++){
            while(!dq_min.empty() && dq_min.front()<=j-DY)
                dq_min.pop_front();
            while(!dq_min.empty() && mat[i][j]<=mat[i][dq_min.back()])
                dq_min.pop_back();

            while(!dq_max.empty() && dq_max.front()<=j-DY)
                dq_max.pop_front();
            while(!dq_max.empty() && mat[i][j]>=mat[i][dq_max.back()])
                dq_max.pop_back();

            dq_min.push_back(j);
            dq_max.push_back(j);

            if(j>=DY){
                temp_min[i][j-DY+1]=mat[i][dq_min.front()];
                temp_max[i][j-DY+1]=mat[i][dq_max.front()];
            }
        }
    }
    int M_max=m-DX+1;
    for(int j=1;j<=N_max;j++){
        deque<int>dq_min,dq_max;
        for(int i=1;i<=m;i++){
            while(!dq_min.empty() && dq_min.front()<=i-DX)
                dq_min.pop_front();
            while(!dq_min.empty() && temp_min[i][j]<=temp_min[dq_min.back()][j])
                dq_min.pop_back();
            
            while(!dq_max.empty() && dq_max.front()<=i-DX)
                dq_max.pop_front();
            while(!dq_max.empty() && temp_max[i][j]>=temp_max[dq_max.back()][j])
                dq_max.pop_back();
            
            dq_min.push_back(i);
            dq_max.push_back(i);

            if(i>=DX){
                min_final[i-DX+1][j]=temp_min[dq_min.front()][j];
                max_final[i-DX+1][j]=temp_max[dq_max.front()][j];
            }
        }
    }
    min_global_diff=100000;
    nr_total=0;
    for(int i=1;i<=M_max;i++){
        for(int j=1;j<=N_max;j++){
            int dif=max_final[i][j]-min_final[i][j];
            if(dif<min_global_diff){
                min_global_diff=dif;
                nr_total=1;
            }
            else if(dif==min_global_diff){
                nr_total++;
            }
        }
    }
    return {min_global_diff,nr_total};
}

int main(){
    citire();
    vector<pair<int,int>>rez_final;
    for(int k=1;k<=p;k++){
        int dx,dy;
        in>>dx>>dy;
        pair<int,int> rez1=proceseaza_dimensiunea(dx,dy);
        int min_global=rez1.first;
        int nr_total=rez1.second;
        if(dx!=dy){
            pair<int,int> rez2=proceseaza_dimensiunea(dy,dx);
            if(rez2.first<min_global){
                min_global=rez2.first;
                nr_total=rez2.second;
            }if(rez2.first==min_global){
                nr_total+=rez2.second;
            }
        }
        rez_final.push_back({min_global,nr_total});
    }
    for(const auto& rez : rez_final){
        out<<rez.first<<" "<<rez.second<<"\n";
    }
}