Cod sursa(job #2464665)

Utilizator GabyD002Dobrita Gabriel GabyD002 Data 28 septembrie 2019 18:51:27
Problema Struti Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.44 kb
#include <bits/stdc++.h>
#define NM 1005
#define val first
#define poz second
#define pb push_back
#define pii pair<int,int>
using namespace std;
ifstream f("struti.in");
ofstream g("struti.out");

int n,m,k,p,q,difMin,nrap,a[NM][NM],v[NM][NM];
int minVal[NM*NM],maxVal[NM*NM];

deque <pii> dqMin[NM],dqMax[NM];

void Read();
void Solve();
void clearDQ();
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()
{   clearDQ();
    for(int i=1; i<=n; i++)
    {   for(int j=1; j<=m; j++)
        {   if(j-p+1>0)
                if(dqMin[i].front().poz<j-p+1)
                    dqMin[i].pop_front();
            if(!dqMin[i].empty())
                while(a[i][j]<=dqMin[i].back().val)
                {   dqMin[i].pop_back();
                    if(dqMin[i].empty())
                        break;
                }
             dqMin[i].pb({a[i][j],j});
             if(j-p+1>0)
                v[i][j]=dqMin[i].front().val;
        }
    }
    clearDQ();
    int ind=0;
    for(int j=p; j<=m; j++)
    {   for(int i=1; i<=n; i++)
        {   if(i-q+1>0)
                if(dqMin[j].front().poz<i-q+1)
                    dqMin[j].pop_front();
            if(!dqMin[j].empty())
                while(v[i][j]<=dqMin[j].back().val)
                {   dqMin[j].pop_back();
                    if(dqMin[j].empty())
                        break;
                }
            dqMin[j].pb({v[i][j],i});
            if(i-q+1>0)
                minVal[++ind]=dqMin[j].front().val;
        }
    }
    clearDQ();
    for(int i=1; i<=n; i++)
    {   for(int j=1; j<=m; j++)
        {   if(j-p+1>0)
                if(dqMax[i].front().poz<j-p+1)
                    dqMax[i].pop_front();
            if(!dqMax[i].empty())
                while(a[i][j]>=dqMax[i].back().val)
                {   dqMax[i].pop_back();
                    if(dqMax[i].empty())
                        break;
                }
             dqMax[i].pb({a[i][j],j});
             if(j-p+1>0)
                v[i][j]=dqMax[i].front().val;
        }
    }
    ind=0;
    clearDQ();
    for(int j=p; j<=m; j++)
    {   for(int i=1; i<=n; i++)
        {   if(i-q+1>0)
                if(dqMax[j].front().poz<i-q+1)
                    dqMax[j].pop_front();
            if(!dqMax[j].empty())
                while(v[i][j]>=dqMax[j].back().val)
                {   dqMax[j].pop_back();
                    if(dqMax[j].empty())
                        break;
                }
            dqMax[j].pb({v[i][j],i});
            if(i-q+1>0)
                maxVal[++ind]=dqMax[j].front().val;
        }
    }
    for(int i=1; i<=ind; i++)
    {   int dif=maxVal[i]-minVal[i];
        if(dif<difMin)
        {   difMin=dif;
            nrap=1;
        }
        else
        if(dif==difMin)
            nrap++;
    }
}

void clearDQ()
{   for(int i=1; i<NM; i++)
        while(!dqMin[i].empty())
            dqMin[i].pop_back();
    for(int i=1; i<NM; i++)
        while(!dqMax[i].empty())
            dqMax[i].pop_back();
}