Cod sursa(job #2464709)

Utilizator GabyD002Dobrita Gabriel GabyD002 Data 28 septembrie 2019 20:16:38
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.2 kb
#include <bits/stdc++.h>
#define NM 1005
#define pb push_back
using namespace std;
ifstream f("struti.in");
ofstream g("struti.out");

int n,m,k,p,q,difMin,nrap,a[NM][NM],vMin[NM][NM],vMax[NM][NM];

deque <int> dqMin,dqMax;

void Read();
void Solve();
void findSol();

int main()
{   Read();
    Solve();
    f.close();
    g.close();
    return 0;
}

void Read()
{   f>>n>>m>>k;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
            f>>a[i][j];
}

void Solve()
{   while(k--)
    {   f>>p>>q;
        difMin=(1<<30);
        nrap=1;
        findSol();
        if(p!=q)
        {   swap(p,q);
            findSol();
        }
        g<<difMin<<' '<<nrap<<'\n';
    }
}

void findSol()
{   for(int i=1; i<=n; i++)
    {   dqMin.clear();
        dqMax.clear();
        for(int j=1; j<=m; j++)
        {   if(dqMin.front()<j-p+1)
                dqMin.pop_front();
            if(dqMax.front()<j-p+1)
                dqMax.pop_front();
            while(dqMin.size() && a[i][j]<a[i][dqMin.back()])
                dqMin.pop_back();
            while(dqMax.size() && a[i][j]>a[i][dqMax.back()])
                dqMax.pop_back();
            dqMin.pb(j);
            dqMax.pb(j);
            if(j-p+1>0)
            {   vMin[i][j]=a[i][dqMin.front()];
                vMax[i][j]=a[i][dqMax.front()];
            }
        }
    }
    for(int j=p; j<=m; j++)
    {   dqMin.clear();
        dqMax.clear();
        for(int i=1; i<=n; i++)
        {   if(dqMin.front()<i-q+1)
                dqMin.pop_front();
            if(dqMax.front()<i-q+1)
                dqMax.pop_front();
            while(dqMin.size() && vMin[i][j]<vMin[dqMin.back()][j])
                dqMin.pop_back();
            while(dqMax.size() && vMax[i][j]>vMax[dqMax.back()][j])
                dqMax.pop_back();
            dqMin.pb(i);
            dqMax.pb(i);
            if(i-q+1>0)
            {   int dif=vMax[dqMax.front()][j]-vMin[dqMin.front()][j];
                if(dif<difMin)
                {   difMin=dif;
                    nrap=1;
                }
                else
                if(dif==difMin)
                    nrap++;
            }
        }
    }
}