Cod sursa(job #2570578)

Utilizator petrisorvmyVamanu Petru Gabriel petrisorvmy Data 4 martie 2020 17:49:30
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.63 kb
#include <bits/stdc++.h>
#define FILE_NAME "struti"
#define fast ios_base :: sync_with_stdio(0); cin.tie(0);
#pragma GCC optimize("O3")
#define NMAX 1000 + 100
using namespace std;

ifstream f(FILE_NAME ".in");
ofstream g(FILE_NAME ".out");

typedef long long ll;
typedef long double ld;
typedef pair<int,int> pi;
typedef pair<ll,ll> llp;
typedef pair<ld,ld> pct;

const ll inf = 1LL << 60;
const ll mod = 1e9 + 7;
const ld eps = 1e-9;


void add(ll &a , ll b)
{
    a += b;
    a %= mod;
}

void sub(ll &a, ll b)
{
    a = (a - b + mod) % mod;
}


int n, m, t, v[NMAX][NMAX], vmin[NMAX][NMAX], vmax[NMAX][NMAX], p , q, dif, cate;


void solve(int p, int q)
{
    deque <int> Qmi, Qmx;
    for(int i = 1; i <= n; ++i)
    {
        for(int j = 1; j <= m; ++j)
        {
            while(!Qmi.empty() && v[i][j] <= v[i][Qmi.back()]) Qmi.pop_back();
            Qmi.push_back(j);
            if(j - p == Qmi.front())
                Qmi.pop_front();
            if(j >= p)
                vmin[i][j] = v[i][Qmi.front()];


            while(!Qmx.empty() && v[i][j] >= v[i][Qmx.back()]) Qmx.pop_back();
            Qmx.push_back(j);
            if(j - p == Qmx.front())
                Qmx.pop_front();
            if(j >= p)
                vmax[i][j] = v[i][Qmx.front()];
        }
        Qmi.clear();
        Qmx.clear();
    }

    for(int j = p; j <= m; ++j)
    {
        for(int i = 1; i <= n; ++i)
        {
            while(!Qmi.empty() && vmin[i][j] <= vmin[Qmi.back()][j]) Qmi.pop_back();
            Qmi.push_back(i);
            if(i - q == Qmi.front())
                Qmi.pop_front();

            while(!Qmx.empty() && vmax[i][j] >= vmax[Qmx.back()][j]) Qmx.pop_back();
            Qmx.push_back(i);
            if(i - q == Qmx.front())
                Qmx.pop_front();

            if(i >= q)
            {
                if(vmax[Qmx.front()][j] - vmin[Qmi.front()][j] < dif)
                {
                    dif = vmax[Qmx.front()][j] - vmin[Qmi.front()][j];
                    cate = 1;
                }
                else if(vmax[Qmx.front()][j] - vmin[Qmi.front()][j] == dif)
                    cate++;
            }
        }
        Qmi.clear();
        Qmx.clear();
    }
}

int main()
{
    f >> n >> m >> t;
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= m; ++j)
            f >> v[i][j];
    while(t--)
    {
        f >> p >> q;
        dif = 1 << 30;
        cate = 0;
        solve(p,q);
        if(p != q)
            solve(q,p);
        g << dif << ' ' << cate << '\n';
    }
    f.close();
    g.close();
    return 0;
}