Cod sursa(job #2269238)

Utilizator AlexandruabcdeDobleaga Alexandru Alexandruabcde Data 25 octombrie 2018 19:42:18
Problema Struti Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.83 kb
#include <bits/stdc++.h>
#define INF 1000000000

using namespace std;

deque <int> dmin[1005];
deque <int> dmax[1005];
deque <int> solmax;
deque <int> solmin;

const int bsize = 1<<23;

char ch[bsize+1];

int n, m, p, a, b, nr, Min, pos;

int v[1005][1005];

void read (int &x)
{
    x = 0;
    while (!isdigit(ch[pos]))
    {
        pos++;
        if (pos == bsize)
        {
            pos = 0;
            fread(ch, 1, bsize, stdin);
        }
    }

    while (isdigit(ch[pos]))
    {
        x = x * 10 + ch[pos] - '0';
        pos++;
        if (pos == bsize)
        {
            pos++;
            fread(ch, 1, bsize, stdin);
        }
    }
}
void solve (int lin, int col)
{
    for (int j = 1; j < col; j++)
    {
        for (int i = 1; i <= n; i++)
        {
            while (!dmin[i].empty() && v[i][dmin[i].back()] >= v[i][j])
            {
                dmin[i].pop_back();
            }
            dmin[i].push_back(j);
            if (j - dmin[i].front() == col) dmin[i].pop_front();

            while (!dmax[i].empty() && v[i][dmax[i].back()] <= v[i][j])
            {
                dmax[i].pop_back();
            }
            dmax[i].push_back(j);
            if (j - dmax[i].front() == col) dmax[i].pop_front();
        }
    }
    for (int j = col; j <= m; j++)
    {
        for (int i = 1; i <= n; i++)
        {
            while (!dmin[i].empty() && v[i][dmin[i].back()] >= v[i][j])
            {
                dmin[i].pop_back();
            }
            dmin[i].push_back(j);
            if (j - dmin[i].front() == col) dmin[i].pop_front();

            while (!dmax[i].empty() && v[i][dmax[i].back()] <= v[i][j])
            {
                dmax[i].pop_back();
            }
            dmax[i].push_back(j);
            if (j - dmax[i].front() == col) dmax[i].pop_front();
        }
        solmax.clear();
        solmin.clear();

        for (int i = 1; i <= n; i++)
        {
            while (!solmin.empty() && v[i][dmin[i].front()] <= v[solmin.back()][dmin[solmin.back()].front()])
            {
                solmin.pop_back();
            }
            solmin.push_back(i);
            if (i - solmin.front() == lin) solmin.pop_front();

            while (!solmax.empty() && v[i][dmax[i].front()] >= v[solmax.back()][dmax[solmax.back()].front()])
            {
                solmax.pop_back();
            }
            solmax.push_back(i);
            if (i - solmax.front() == lin)
            {
                solmax.pop_front();
            }
            if (i >= lin)
            {
                if (v[solmax.front()][dmax[solmax.front()].front()] - v[solmin.front()][dmin[solmin.front()].front()] < Min)
                {
                    nr = 1;
                    Min = v[solmax.front()][dmax[solmax.front()].front()] - v[solmin.front()][dmin[solmin.front()].front()];
                }
                else if (v[solmax.front()][dmax[solmax.front()].front()] - v[solmin.front()][dmin[solmin.front()].front()] == Min)
                {
                    nr++;
                }
            }

        }
    }

    for (int i = 1; i <= n; i++)
    {
        dmin[i].clear();
        dmax[i].clear();
    }
}
int main()
{
    freopen("struti.in", "r", stdin);
    freopen("struti.out", "w", stdout);
    ios_base :: sync_with_stdio(false);

    fread(ch, 1, bsize, stdin);
    pos = 0;

    read(n);
    read(m);
    read(p);

    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
            read(v[i][j]);
    }

    for (; p; p--)
    {
        read(a);
        read(b);

        Min = INF;
        nr = 0;
        solve(a, b);
        if (a != b)
        {
            solve(b, a);
        }

        cout << Min << " " << nr << '\n';
    }
    return 0;
}