Cod sursa(job #2059810)

Utilizator dragostanTantaru Dragos Constantin dragostan Data 7 noiembrie 2017 17:11:21
Problema Struti Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.38 kb
#include <iostream>
#include <math.h>
using namespace std;
const int DIM = 1001;
int alp[DIM][DIM], d[DIM * DIM], mx[DIM][DIM], mn[DIM][DIM], n, m, p, dx[DIM], dm[DIM];
int dmx(int x);
int all(int x, int y, int& mini);
int main()
{
    int dx, dy;
    cin >> n >> m >> p;
    for(int i = 1; i <= n; ++i)
    {
        for(int j = 1; j <= m; ++j)
            cin >> alp[i][j];
    }
    for(int i = 1; i <= p; ++i)
    {
        cin >> dx >> dy;

        int mini = 9000, nrt = 0, mnou;
        dmx(dx);
        nrt += all(dx, dy, mini);
        if(dx != dy)
        {
            dmx(dy);
            nrt += all(dy, dx, mini);
        }

        cout << mini << ' ' << nrt << '\n';

    }
    return 0;
}


int all(int x, int y, int& mini)
{
    int dif = 3920243, t = 0;
    for(int i = x; i <= n; ++i)
    {
        int st = 0, dr = -1, sti = 0, dri = -1;
        dif = 9301291;
        for(int j = 1; j <= m; ++j)
        {
            if(st <= dr && dx[st] == j - y)
            {
                ++st;
            }
            while(st <= dr && mx[i][j] >= mx[i][dx[dr]])
            {
                --dr;
            }
            dx[++dr] = j;


            if(sti <= dri && dx[sti] == j - y)
            {
                ++sti;
            }
            while(sti <= dri && mx[i][j] >= mx[i][dm[dri]])
            {
                --dri;
            }
            dx[++dri] = j;

            if(mx[i][dx[st]] - mn[i][dm[sti]] == dif) ++t;
            else if(mx[i][dx[st]] - mn[i][dm[sti]] < dif)
            {
                dif = mx[i][dx[st]] - mn[i][dm[sti]];
                t = 1;
            }
        }
    }
    cout << dif << endl;
    mini = dif;
    return t;
}

int dmx(int x)
{

    for(int j = 1; j <= m; ++j)
    {
        int st = 0, dr = -1, sti = 0, dri = -1;
        for(int i = 1; i <= n; ++i)
        {
            if(st <= dr && dx[st] == i - x )
                ++st;
            while(st <= dr && alp[i][j] >= alp[dx[dr]][j])
            {
                --dr;
            }
            dx[++dr] = i;
            if(i >= x)
                mx[i][j] = alp[dx[st]][j];
            ///URMEAZA PENTRU MINIM

            if(sti <= dri && dm[sti] == i - x)
                ++sti;
            while(sti <= dri && alp[i][j] <= alp[dm[dri]][j])
            {
                --dri;
            }
            dm[++dri] = i;
            if(i >= x)
                mx[i][j] = alp[dm[sti]][j];
        }
    }

}