Cod sursa(job #2974991)

Utilizator Horia_haivasHaivas Horia Horia_haivas Data 4 februarie 2023 23:55:58
Problema Struti Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 6.6 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;

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

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