Cod sursa(job #3331503)

Utilizator mariusharabariMarius Harabari mariusharabari Data 28 decembrie 2025 18:56:59
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.33 kb
#include <bits/stdc++.h>
using namespace std;

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

const int NMAX=1e3+1, INF=8e3+1;
int m, n, p, dx, dy, dif, nr;
int mat[NMAX][NMAX], minim[NMAX][NMAX], maxim[NMAX][NMAX];

void solve(int dx, int dy){
     for(int i=1;i<=m;i++){
        deque <int> dqmin, dqmax;

        for(int j=1;j<dy;j++){
            while(!dqmin.empty()&&mat[i][j]<mat[i][dqmin.back()])
                dqmin.pop_back();
            while(!dqmax.empty()&&mat[i][j]>mat[i][dqmax.back()])
                dqmax.pop_back();

            dqmin.push_back(j);
            dqmax.push_back(j);
        }

        for(int j=dy;j<=n;j++){
            while(!dqmin.empty()&&mat[i][j]<mat[i][dqmin.back()])
                dqmin.pop_back();
            while(!dqmax.empty()&&mat[i][j]>mat[i][dqmax.back()])
                dqmax.pop_back();

            if(!dqmin.empty()&&dqmin.front()==j-dy)
                dqmin.pop_front();
            if(!dqmax.empty()&&dqmax.front()==j-dy)
                dqmax.pop_front();

            dqmin.push_back(j);
            dqmax.push_back(j);

            minim[i][j]=dqmin.front();
            maxim[i][j]=dqmax.front();
        }
     }
     /*cout<<dx<<' '<<dy<<endl<<endl;
     for(int i=1;i<=m;i++){
        for(int j=1;j<=n;j++){
            cout<<minim[i][j]<<' ';
        }
        cout<<endl;
     }
     cout<<endl;

     for(int i=1;i<=m;i++){
        for(int j=1;j<=n;j++){
            cout<<maxim[i][j]<<' ';
        }
        cout<<endl;
     }
     cout<<endl;*/

     for(int j=dy;j<=n;j++){
        deque <int> dqmin, dqmax;

        for(int i=1;i<dx;i++){
            while(!dqmin.empty()&&mat[i][minim[i][j]]<mat[dqmin.back()][minim[dqmin.back()][j]])
                dqmin.pop_back();
            while(!dqmax.empty()&&mat[i][maxim[i][j]]>mat[dqmax.back()][maxim[dqmax.back()][j]])
                dqmax.pop_back();

            dqmin.push_back(i);
            dqmax.push_back(i);
        }

        for(int i=dx;i<=m;i++){
            while(!dqmin.empty()&&mat[i][minim[i][j]]<mat[dqmin.back()][minim[dqmin.back()][j]])
                dqmin.pop_back();
            while(!dqmax.empty()&&mat[i][maxim[i][j]]>mat[dqmax.back()][maxim[dqmax.back()][j]])
                dqmax.pop_back();

            if(!dqmin.empty()&&dqmin.front()==i-dx)
                dqmin.pop_front();
            if(!dqmax.empty()&&dqmax.front()==i-dx)
                dqmax.pop_front();

            dqmin.push_back(i);
            dqmax.push_back(i);

            if(dif>mat[dqmax.front()][maxim[dqmax.front()][j]]-mat[dqmin.front()][minim[dqmin.front()][j]]){
                dif=mat[dqmax.front()][maxim[dqmax.front()][j]]-mat[dqmin.front()][minim[dqmin.front()][j]];
                //cout<<i<<' '<<j<<' '<<dif<<endl;
                nr=1;
            }
            else if(dif==mat[dqmax.front()][maxim[dqmax.front()][j]]-mat[dqmin.front()][minim[dqmin.front()][j]]){
                nr++;
            }
        }
     }
}

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

    for(int i=0;i<p;i++){
        dif=INF;
        nr=0;
        fin>>dx>>dy;

        solve(dx, dy);
        if(dx!=dy)
            solve(dy, dx);

        fout<<dif<<' '<<nr<<'\n';
    }
    return 0;
}