Cod sursa(job #2981817)

Utilizator Horia_haivasHaivas Horia Horia_haivas Data 18 februarie 2023 19:25:20
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.34 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;
deque <int> dqmax;
deque <int> dqminindice;
deque <int> dqmaxindice;
int n,m,p,i,j,lat1,lat2,mi,ap,k;

void solve (int l1, int 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++;
                }
            }
        }
    }
}

int main()
{
    ifstream fin("struti.in");
    ofstream fout("struti.out");
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    fin >> n >> m >> p;
    for (i=1; i<=n; i++)
    {
        for (j=1; j<=m; j++)
        {
            fin >> a[i][j];
        }
    }
    for (k=1; k<=p; k++)
    {
        ap=0;
        mi=8001;
        fin >> lat1 >> lat2;
        solve(lat1,lat2);
        if (lat1!=lat2)
            solve(lat2,lat1);
        fout << mi << " " << ap << "\n";
    }
}