Cod sursa(job #3292075)

Utilizator Victor5539Tanase Victor Victor5539 Data 7 aprilie 2025 08:13:33
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.31 kb
#include <iostream>
#include <fstream>
#include <deque>

using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");

const int MAX=1000;
int n,m,v[MAX+5][MAX+5],i,j,dx,dy,p,mx[MAX+5][MAX+5],mn[MAX+5][MAX+5],cnt,minim;
deque <int> dq,dq2;

void task(int dx, int dy)
{
    for (i=1; i<=n; i++)
    {
        for (j=1; j<=dy; j++)
        {
            while (!dq.empty() && v[i][j]>v[i][dq.back()])
                dq.pop_back();

            dq.push_back(j);
        }

        mx[i][dy]=v[i][dq.front()];

        for (j=dy+1; j<=m; j++)
        {
            while (!dq.empty() && dq.front()<=j-dy)
                dq.pop_front();

            while (!dq.empty() && v[i][j]>v[i][dq.back()])
                dq.pop_back();

            dq.push_back(j);

            mx[i][j]=v[i][dq.front()];
        }

        while (!dq.empty())
            dq.pop_back();
    }

    for (i=1; i<=n; i++)
    {
        for (j=1; j<=dy; j++)
        {
            while (!dq.empty() && v[i][j]<v[i][dq.back()])
                dq.pop_back();

            dq.push_back(j);
        }

        mn[i][dy]=v[i][dq.front()];

        for (j=dy+1; j<=m; j++)
        {
            while (!dq.empty() && dq.front()<=j-dy)
                dq.pop_front();

            while (!dq.empty() && v[i][j]<v[i][dq.back()])
                dq.pop_back();

            dq.push_back(j);

            mn[i][j]=v[i][dq.front()];
        }

        while (!dq.empty())
            dq.pop_back();
    }

    for (j=dy; j<=m; j++)
    {
        for (i=1; i<=dx; i++)
        {
            while (!dq.empty() && mx[i][j]>mx[dq.back()][j])
                dq.pop_back();

            while (!dq2.empty() && mn[i][j]<mn[dq2.back()][j])
                dq2.pop_back();

            dq.push_back(i);
            dq2.push_back(i);
        }

        if (mx[dq.front()][j]-mn[dq2.front()][j]<minim)
        {
            minim=mx[dq.front()][j]-mn[dq2.front()][j];
            cnt=1;
        }
        else if (mx[dq.front()][j]-mn[dq2.front()][j]==minim)
            cnt++;

        for (i=dx+1; i<=n; i++)
        {
            while (!dq.empty() && dq.front()<=i-dx)
                dq.pop_front();

            while (!dq2.empty() && dq2.front()<=i-dx)
                dq2.pop_front();

            while (!dq.empty() && mx[i][j]>mx[dq.back()][j])
                dq.pop_back();

            while (!dq2.empty() && mn[i][j]<mn[dq2.back()][j])
                dq2.pop_back();

            dq.push_back(i);
            dq2.push_back(i);

            if (mx[dq.front()][j]-mn[dq2.front()][j]<minim)
            {
                minim=mx[dq.front()][j]-mn[dq2.front()][j];
                cnt=1;
            }
            else if (mx[dq.front()][j]-mn[dq2.front()][j]==minim)
                cnt++;
        }

        while (!dq.empty())
            dq.pop_back();

        while (!dq2.empty())
            dq2.pop_back();
    }

}


int main()
{
    fin>>n>>m>>p;

    for (i=1; i<=n; i++)
        for (j=1; j<=m; j++)
            fin>>v[i][j];

    while (p)
    {
        fin>>dx>>dy;

        cnt=0;
        minim=1e9;
        task(dx,dy);

        if (dx!=dy)
            task(dy,dx);

        fout<<minim<<" "<<cnt<<"\n";
        p--;
    }
    return 0;
}