Cod sursa(job #2759389)

Utilizator tryharderulbrebenel mihnea stefan tryharderul Data 17 iunie 2021 15:40:06
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.69 kb
#include <bits/stdc++.h>

using namespace std;

int n,m,query;
int v[1003][1003];
int min_mat[1003][1003];
int max_mat[1003][1003];
deque<int>q;
deque<int>q2;

struct elem{
    int hmin,nr;
};

elem solve(int x,int y){
    int ans=INT_MAX,nr=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            while(!q.empty() && v[i][j] < v[i][q.back()]){
                q.pop_back();
            }
            q.push_back(j);
            if(j-q.front()>=y){
                q.pop_front();
            }
            if(j>=y){
                min_mat[i][j-y+1]=v[i][q.front()];
            }
        }
        q.clear();
    }
    q.clear();
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            while(!q.empty() && v[i][j] > v[i][q.back()]){
                q.pop_back();
            }
            q.push_back(j);
            if(j-q.front()>=y){
                q.pop_front();
            }
            if(j>=y){
                max_mat[i][j-y+1]=v[i][q.front()];
            }
        }
        q.clear();
    }
    for(int j=1;j<=m-y+1;j++){
        for(int i=1;i<=n;i++){
            while(!q2.empty() && min_mat[i][j] < min_mat[q2.back()][j] ){
                q2.pop_back();
            }
            q2.push_back(i);
            if(i-q2.front()>=x){
                q2.pop_front();
            }
            while(!q.empty() && max_mat[i][j] > max_mat[q.back()][j]){
                q.pop_back();
            }
            q.push_back(i);
            if(i-q.front()>=x){
                q.pop_front();
            }
            if(i>=x){
                if(ans > max_mat[q.front()][j] - min_mat[q2.front()][j] ){
                    ans=max_mat[q.front()][j] - min_mat[q2.front()][j];
                    nr=1;
                }else if(ans == max_mat[q.front()][j] - min_mat[q2.front()][j] ){
                    nr++;
                }
            }
        }
        q.clear();
        q2.clear();

    }


    return {ans,nr};
}

int main()
{
    freopen("struti.in","r",stdin);
    freopen("struti.out","w",stdout);
    scanf("%d %d %d",&n,&m,&query);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            scanf("%d",&v[i][j]);
    while(query--){
        int x,y;
        scanf("%d %d",&x,&y);
        elem a = solve(x,y);
        elem b = solve(y,x);
        if(x==y){
            printf("%d %d\n",a.hmin,a.nr);
            continue;
        }
        if(a.hmin < b.hmin){
            printf("%d %d\n",a.hmin,a.nr);
        }else if(a.hmin > b.hmin){
            printf("%d %d\n",b.hmin,b.nr);
        }else{
            printf("%d %d\n",a.hmin,a.nr+b.nr);
        }

    }
    return 0;
}