Cod sursa(job #1068137)

Utilizator marta_diannaFII Filimon Marta Diana marta_dianna Data 27 decembrie 2013 22:21:16
Problema Struti Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 2.93 kb
#include<fstream>
#include<deque>
#define NMAX 1010

using namespace std;

ifstream f("struti.in");
ofstream g("struti.out");

int n, m, P, mn, nr, lung, lat, a[NMAX][NMAX];
deque<int> DMAX, DMIN, dmax[NMAX], dmin[NMAX];

void Citeste()
{
    int i, j;

    f>>n>>m>>P;

    for (i=1; i<=n; ++i)
        for (j=1; j<=m; ++j) f>>a[i][j];
}

void Initializeaza()
{
    int i;

    for (i=1; i<=n; ++i)
    {
        dmin[i].clear();
        dmax[i].clear();
    }

    DMIN.clear();
    DMAX.clear();
}

void Init()
{
    int i, j;

    for (i=1; i<=n; ++i)
        for (j=1; j<lung; ++j)
        {
            //dmin

            while (!dmin[i].empty() && a[i][dmin[i].back()]>a[i][j])
                dmin[i].pop_back();

            dmin[i].push_back(j);

            //dmax

            while (!dmax[i].empty() && a[i][dmax[i].back()]<a[i][j])
                dmax[i].pop_back();

            dmax[i].push_back(j);
        }
}

void Solve()
{
    int i, j, pmax, pmin, val;

    for (j=lung; j<=m; ++j)
    {
        for (i=1; i<=n; ++i)
        {
            //dmin

            while (!dmin[i].empty() && a[i][dmin[i].back()]>a[i][j]) dmin[i].pop_back();

            if (!dmin[i].empty() && dmin[i].front()==j-lung) dmin[i].pop_front();

            dmin[i].push_back(j);

            //dmax

            while (!dmax[i].empty() && a[i][dmax[i].back()]<a[i][j]) dmax[i].pop_back();

            if (!dmax[i].empty() && dmax[i].front()==j-lung) dmax[i].pop_front();

            dmax[i].push_back(j);

            //solutie

            pmax=dmax[i].front();
            pmin=dmin[i].front();

            while (!DMIN.empty() && a[DMIN.back()][dmin[DMIN.back()].front()]>a[i][pmin]) DMIN.pop_back();

            if (i-lat>0 && !DMIN.empty() && DMIN.front()==i-lat) DMIN.pop_front();

            DMIN.push_back(i);

            while (!DMAX.empty() && a[DMAX.back()][dmax[DMAX.back()].front()]<a[i][pmax]) DMAX.pop_back();

            if (i-lat>0 && !DMAX.empty() && DMAX.front()==i-lat) DMAX.pop_front();

            DMAX.push_back(i);

            if (i-lat>=0)
            {
                val=a[DMAX.front()][dmax[DMAX.front()].front()]-a[DMIN.front()][dmin[DMIN.front()].front()];
                if (val<mn)
                {
                    mn=val;
                    nr=1;
                }
                else
                    if (val==mn) ++nr;
            }

        }
        DMIN.clear();
        DMAX.clear();
    }
}

int main()
{
    Citeste();

    while (P--)
    {
        f>>lat>>lung;

        mn=NMAX*NMAX; nr=0;

        Initializeaza();

        Init();

        Solve();

        if (lung!=lat)
        {
            swap(lung, lat);

            Initializeaza();

            Init();

            Solve();
        }

        g<<mn<<" "<<nr<<"\n";
    }

    f.close();
    g.close();
    return 0;
}