Cod sursa(job #2976781)

Utilizator antonio_sefu_tauLaslau Antonio antonio_sefu_tau Data 9 februarie 2023 23:31:41
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.34 kb
#include <iostream>
#include <fstream>
#include <deque>
#include <vector>
using namespace std;
const int dim=1005;
int mn,nr;
int a[dim][dim],n,m,q,v[dim],vmn[dim][dim],vmx[dim][dim],vmnf[dim][dim],vmxf[dim][dim];
void calc(int x, int y){
    mn=1e9,nr=0;
    int lin=0,col=0;
    deque<int> dqmin,dqmax;
    for(int i=1;i<=n;i++){
        int len=0;
        col=0;
        for(int j=1;j<=m;j++){
            v[++len]=a[i][j];
        }
        dqmin.clear();
        dqmax.clear();
        for(int j=1;j<=len;j++){
            while(!dqmin.empty() and v[j]<v[dqmin.back()]){
                dqmin.pop_back();
            }
            dqmin.push_back(j);
            if(dqmin.front()==j-x){
                dqmin.pop_front();
            }
            if(j>=x){
                vmn[i][++col]=v[dqmin.front()];
            }
            while(!dqmax.empty() and v[j]>v[dqmax.back()]){
                dqmax.pop_back();
            }
            dqmax.push_back(j);
            if(dqmax.front()==j-x){
                dqmax.pop_front();
            }
            if(j>=x){
                vmx[i][col]=v[dqmax.front()];
            }
        }
    }
    dqmax.clear();
    dqmin.clear();
    for(int j=1;j<=col;j++){
        int len=0;
        lin=0;
        dqmin.clear();
        dqmax.clear();
        for(int i=1;i<=n;i++){
            v[++len]=vmn[i][j];
        }
        for(int i=1;i<=n;i++){
            while(!dqmin.empty() and v[i]<v[dqmin.back()]){
                dqmin.pop_back();
            }
            dqmin.push_back(i);
            if(dqmin.front()==i-y){
                dqmin.pop_front();
            }
            if(i>=y){
                vmnf[++lin][j]=v[dqmin.front()];
            }
        }
    }
    for(int j=1;j<=col;j++){
        int len=0;
        lin=0;
        dqmin.clear();
        dqmax.clear();
        for(int i=1;i<=n;i++){
            v[++len]=vmx[i][j];
        }
        for(int i=1;i<=n;i++){
            while(!dqmax.empty() and v[i]>v[dqmax.back()]){
                dqmax.pop_back();
            }
            dqmax.push_back(i);
            if(dqmax.front()==i-y){
                dqmax.pop_front();
            }
            if(i>=y){
                vmxf[++lin][j]=v[dqmax.front()];
            }
        }
    }
    for(int i=1;i<=lin;i++){
        for(int j=1;j<=col;j++){
            if(mn>vmxf[i][j]-vmnf[i][j]){
                mn=vmxf[i][j]-vmnf[i][j];
                nr=1;
            }
            else
            if(mn==vmxf[i][j]-vmnf[i][j]){
                nr++;
            }
        }
    }
}
int main(){
    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 x,y,m1,m2,n1,n2;
        cin>>x>>y;
        calc(x,y);
        m1=mn;
        n1=nr;
        if(x!=y){
            calc(y,x);
            m2=mn;
            n2=nr;
            if(m1<m2){
                cout<<m1<<' '<<n1;
            }
            else
            if(m1>m2){
                cout<<m2<<' '<<n2;
            }
            else{
                cout<<m1<<' '<<n1+n2;
            }
        }
        else{
            cout<<m1<<' '<<n1;
        }
        cout<<endl;
    }
    return 0;
}