Cod sursa(job #2906237)

Utilizator AswVwsACamburu Luca AswVwsA Data 25 mai 2022 11:15:40
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.59 kb
//interesant
#include <fstream>
#include <vector>
#include <climits>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;

ifstream cin("struti.in");
ofstream cout("struti.out");
int mn, cnt;

struct ceva
{
    int mn, mx;
    int val;
} v[1003][1003];

int dmin[1003], dmax[1003], n, m;
void solve(int a, int b)
{
    int i, j, stmin, drmin, stmax, drmax;
    for (j = 1; j <= m; j++)
    {
        stmin = stmax = 1;
        drmin = drmax = 0;
        for (i = 1; i <= a; i++)
        {
            while (stmin <= drmin and v[i][j].val < v[dmin[drmin]][j].val)
                drmin--;
            while (stmax <= drmax and v[i][j].val > v[dmax[drmax]][j].val)
                drmax--;

            dmax[++drmax] = i;
            dmin[++drmin] = i;

            v[i][j].mn = v[dmin[stmin]][j].val;
            v[i][j].mx = v[dmax[stmax]][j].val;
        }

        for (i = a + 1; i <= n; i++)
        {
            while (stmin <= drmin and dmin[stmin] <= i - a)
                stmin++;
            while (stmax <= drmax and dmax[stmax] <= i - a)
                stmax++;

            while (stmin <= drmin and v[i][j].val < v[dmin[drmin]][j].val)
                drmin--;
            while (stmax <= drmax and v[i][j].val > v[dmax[drmax]][j].val)
                drmax--;

            dmax[++drmax] = i;
            dmin[++drmin] = i;

            v[i][j].mn = v[dmin[stmin]][j].val;
            v[i][j].mx = v[dmax[stmax]][j].val;
        }
    }
    /*for (i = 1; i <= n; i++, cout << "\n")
        for (j = 1; j <= m; j++)
            cout << v[i][j].mn << " ";
    cout << "\n\n\n";
    for (i = 1; i <= n; i++, cout << "\n")
        for (j = 1; j <= m; j++)
            cout << v[i][j].mx << " ";*/
    for (i = a; i <= n; i++)
    {
        drmax = drmin = 0;
        stmax = stmin = 1;
        for (j = 1; j <= b; j++)
        {
            while (stmin <= drmin and v[i][j].mn < v[i][dmin[drmin]].mn)
                drmin--;
            while (stmax <= drmax and v[i][j].mx > v[i][dmax[drmax]].mx)
                drmax--;

            dmax[++drmax] = j;
            dmin[++drmin] = j;
        }
        if (mn > v[i][dmax[stmax]].mx - v[i][dmin[stmin]].mn)
        {
            mn = v[i][dmax[stmax]].mx - v[i][dmin[stmin]].mn;
            cnt = 1;
        }
        else
            cnt += (mn == v[i][dmax[stmax]].mx - v[i][dmin[stmin]].mn);
        for (j = b + 1; j <= m; j++)
        {
            while (stmin <= drmin and dmin[stmin] <= j - b)
                stmin++;
            while (stmax <= drmax and dmax[stmax] <= j - b)
                stmax++;
            while (stmin <= drmin and v[i][j].mn < v[i][dmin[drmin]].mn)
                drmin--;
            while (stmax <= drmax and v[i][j].mx > v[i][dmax[drmax]].mx)
                drmax--;
            dmax[++drmax] = j;
            dmin[++drmin] = j;
            if (mn > v[i][dmax[stmax]].mx - v[i][dmin[stmin]].mn)
            {
                mn = v[i][dmax[stmax]].mx - v[i][dmin[stmin]].mn;
                cnt = 1;
            }
            else
                cnt += (mn == v[i][dmax[stmax]].mx - v[i][dmin[stmin]].mn);

        }
    }
}
int main()
{
    int p, i, j;
    cin >> n >> m >> p;
    for (i = 1; i <= n; i++)
        for (j = 1; j <= m; j++)
            cin >> v[i][j].val;
    while (p--)
    {
        int a, b;
        cin >> a >> b;
        mn = INT_MAX;
        cnt = 0;
        solve(a, b);
        //return 0;
        if (a != b)
            solve(b, a);
        cout << mn << ' ' << cnt << "\n";
    }

}