Cod sursa(job #2975598)

Utilizator Horia_haivasHaivas Horia Horia_haivas Data 6 februarie 2023 20:52:35
Problema Struti Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 6.44 kb
/*
    "TLE is like the wind, always by my side"
    - Yasuo - 2022 -
*/
#include <bits/stdc++.h>
#define debug(x) cerr << #x << " " << x << "\n"
#define debugs(x) cerr << #x << " " << x << " "

using namespace std;

short int a[1001][1001];
deque <short int> dq[1001];
deque <short int> dq2[1001];
deque <short int> dqmin;
deque <short int> dqmax;
deque <short int> dqminindice;
deque <short int> dqmaxindice;

int main()
{
    ifstream fin("struti.in");
    ofstream fout("struti.out");
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    short int n,m,p,i,j,l1,l2,mi,ap,k;
    fin >> m >> n >> p;
    for (i=1; i<=n; i++)
    {
        for (j=1; j<=m; j++)
        {
            fin >> a[i][j];
        }
    }
    ap=0;
    mi=8001;
    for (k=1; k<=p; k++)
    {
        fin >> l1 >> l2;
        for (i=1; i<=max(n,m); i++)
        {
            dq[i].clear();
            dq2[i].clear();
            dqmin.clear();
            dqminindice.clear();
            dqmax.clear();
            dqmaxindice.clear();
        }
        for (j=1; j<=m; j++)
        {
            dqmin.clear();
            dqminindice.clear();
            dqmax.clear();
            dqmaxindice.clear();
            for (i=1; i<=n; i++)
            {
                while (!dq[i].empty() && j-dq[i].front()>=l1)
                    dq[i].pop_front();
                while (!dq2[i].empty() && j-dq2[i].front()>=l1)
                    dq2[i].pop_front();
                while (!dq[i].empty() && a[i][j]<a[i][dq[i].back()])
                    dq[i].pop_back();
                while (!dq2[i].empty() && a[i][j]>a[i][dq2[i].back()])
                    dq2[i].pop_back();
                dq[i].push_back(j);
                dq2[i].push_back(j);
                if (j>=l1)
                {
                    while (!dqmin.empty() && i-dqminindice.front()>=l2)
                    {
                        dqmin.pop_front();
                        dqminindice.pop_front();
                    }
                    while (!dqmax.empty() && i-dqmaxindice.front()>=l2)
                    {
                        dqmax.pop_front();
                        dqmaxindice.pop_front();
                    }
                    while (!dqmin.empty() && a[i][dq[i].front()]<a[dqminindice.back()][dqmin.back()])
                    {
                        dqmin.pop_back();
                        dqminindice.pop_back();
                    }
                    while(!dqmax.empty() && a[i][dq2[i].front()]>a[dqmaxindice.back()][dqmax.back()])
                    {
                        dqmax.pop_back();
                        dqmaxindice.pop_back();
                    }
                    dqmin.push_back(dq[i].front());
                    dqminindice.push_back(i);
                    dqmax.push_back(dq2[i].front());
                    dqmaxindice.push_back(i);
                    if (i>=l2)
                    {
                        if (a[dqmaxindice.front()][dqmax.front()]-a[dqminindice.front()][dqmin.front()]<mi)
                        {
                            mi=a[dqmaxindice.front()][dqmax.front()]-a[dqminindice.front()][dqmin.front()];
                            ap=0;
                        }
                        if (a[dqmaxindice.front()][dqmax.front()]-a[dqminindice.front()][dqmin.front()]==mi)
                            ap++;
                    }
                }
            }
        }
        if (l1!=l2)
        {
            for (i=1; i<=max(n,m); i++)
            {
                dq[i].clear();
                dq2[i].clear();
                dqmin.clear();
                dqminindice.clear();
                dqmax.clear();
                dqmaxindice.clear();
            }
            for (j=1; j<=m; j++)
            {
                dqmin.clear();
                dqminindice.clear();
                dqmax.clear();
                dqmaxindice.clear();
                for (i=1; i<=n; i++)
                {
                    while (!dq[i].empty() && j-dq[i].front()>=l1)
                        dq[i].pop_front();
                    while (!dq2[i].empty() && j-dq2[i].front()>=l1)
                        dq2[i].pop_front();
                    while (!dq[i].empty() && a[i][j]<a[i][dq[i].back()])
                        dq[i].pop_back();
                    while (!dq2[i].empty() && a[i][j]>a[i][dq2[i].back()])
                        dq2[i].pop_back();
                    dq[i].push_back(j);
                    dq2[i].push_back(j);
                    if (j>=l1)
                    {
                        while (!dqmin.empty() && i-dqminindice.front()>=l2)
                        {
                            dqmin.pop_front();
                            dqminindice.pop_front();
                        }
                        while (!dqmax.empty() && i-dqmaxindice.front()>=l2)
                        {
                            dqmax.pop_front();
                            dqmaxindice.pop_front();
                        }
                        while (!dqmin.empty() && a[i][dq[i].front()]<a[dqminindice.back()][dqmin.back()])
                        {
                            dqmin.pop_back();
                            dqminindice.pop_back();
                        }
                        while(!dqmax.empty() && a[i][dq2[i].front()]>a[dqmaxindice.back()][dqmax.back()])
                        {
                            dqmax.pop_back();
                            dqmaxindice.pop_back();
                        }
                        dqmin.push_back(dq[i].front());
                        dqminindice.push_back(i);
                        dqmax.push_back(dq2[i].front());
                        dqmaxindice.push_back(i);
                        if (i>=l2)
                        {
                            if (a[dqmaxindice.front()][dqmax.front()]-a[dqminindice.front()][dqmin.front()]<mi)
                            {
                                mi=a[dqmaxindice.front()][dqmax.front()]-a[dqminindice.front()][dqmin.front()];
                                ap=0;
                            }
                            if (a[dqmaxindice.front()][dqmax.front()]-a[dqminindice.front()][dqmin.front()]==mi)
                                ap++;
                        }
                    }
                }
            }
        }
        fout << mi << " " << ap << "\n";
    }
}