Cod sursa(job #3271518)

Utilizator unomMirel Costel unom Data 26 ianuarie 2025 14:28:35
Problema Struti Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.56 kb
#include <fstream>
#include <deque>

using namespace std;

ifstream in("struti.in");
ofstream out("struti.out");
int n, m, q;
int v[1005][1005];
int xmax[1005][1005];
int xmin[1005][1005];
int INF = (1 << 30);

pair<int, int> solve(int dx, int dy)
{
    int rez = INF;
    int nr = 0;

    for(int i = 1; i<=n; i++)
    {
        deque<int> dmin;
        deque<int> dmax;

        for(int j = 1; j<=m; j++)
        {
            while(!dmin.empty() && v[i][j] <= v[i][dmin.back()])
            {
                dmin.pop_back();
            }

            while(!dmax.empty() && v[i][j] >= v[i][dmax.back()])
            {
                dmax.pop_back();
            }

            dmin.push_back(j);
            dmax.push_back(j);

            if(dmin.front() == j - dy)
            {
                dmin.pop_front();
            }
            if(dmax.front() == j - dy)
            {
                dmax.pop_front();
            }

            if(j >= dy)
            {
                xmin[i][j] = v[i][dmin.front()];
                xmax[i][j] = v[i][dmax.front()];
            }
        }
    }

    /*for(int i = 1; i<=n; i++)
    {
        for(int j = 1; j<=m; j++)
        {
            out<<xmin[i][j]<<" ";
        }
        out<<'\n';
    }
    out<<'\n';
    for(int i = 1; i<=n; i++)
    {
        for(int j = 1; j<=m; j++)
        {
            out<<xmax[i][j]<<" ";
        }
        out<<'\n';
    }*/

    for(int j = dy; j<=m; j++)
    {
        deque<int> dmin;
        deque<int> dmax;

        for(int i = 1; i<=n; i++)
        {
            while(!dmin.empty() && xmin[i][j] <= xmin[dmin.back()][j])
            {
                dmin.pop_back();
            }
            while(!dmax.empty() && xmax[i][j] >= xmax[dmax.back()][j])
            {
                dmax.pop_back();
            }

            dmin.push_back(i);
            dmax.push_back(i);

            if(dmin.front() == i - dx)
            {
                dmin.pop_front();
            }
            if(dmax.front() == i - dx)
            {
                dmax.pop_front();
            }

            if(i >= dx)
            {
                //out<<i<<" "<<j<<" "<<xmax[dmax.front()][j]<<" "<<xmin[dmin.front()][j]<<'\n';

                if(xmax[dmax.front()][j] - xmin[dmin.front()][j] < rez)
                {
                    rez = xmax[dmax.front()][j] - xmin[dmin.front()][j];
                    nr = 1;
                }
                else if(xmax[dmax.front()][j] - xmin[dmin.front()][j] == rez)
                {
                    nr++;
                }
            }
        }
    }

    return {rez, nr};
}

int main()
{
    in>>n>>m>>q;
    for(int i = 1; i<=n; i++)
    {
        for(int j = 1; j<=m; j++)
        {
            in>>v[i][j];
        }
    }

    int x, y;
    pair<int, int> ans1, ans2;
    while(q--)
    {
        in>>x>>y;

        if(x == y)
        {
            ans1 = solve(x, y);
            out<<ans1.first<<" "<<ans1.second<<'\n';
        }
        else
        {
            ans1 = solve(x, y);
            ans2 = solve(y, x);

            if(ans1.first > ans2.first)
            {
                out<<ans1.first<<" "<<ans1.second<<'\n';
            }
            else if(ans1.first < ans2.first)
            {
                out<<ans2.first<<" "<<ans2.second<<'\n';
            }
            else
            {
                out<<ans1.first<<" "<<ans1.second + ans2.second<<'\n';
            }
        }
    }

    return 0;
}