Mai intai trebuie sa te autentifici.

Cod sursa(job #2269714)

Utilizator MarianConstantinMarian Constantin MarianConstantin Data 26 octombrie 2018 14:31:12
Problema Struti Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 7.39 kb
#include <iostream>
#include <fstream>
#include <deque>
#define NMAX 1010
#define minx minVal[i][j].x
#define miny minVal[i][j].y
#define maxx maxVal[i][j].x
#define maxy maxVal[i][j].y

#define minxa minValAux[i][j].x
#define minya minValAux[i][j].y
#define maxxa maxValAux[i][j].x
#define maxya maxValAux[i][j].y

using namespace std;

struct
{
    int x, y;
}minVal[NMAX][NMAX], maxVal[NMAX][NMAX];
int matrix[NMAX][NMAX];
deque < pair < int , int > > minAlt;
deque < pair < int , int > > maxAlt;

int main()
{
    ifstream fin("struti.in");
    ofstream fout("struti.out");
    int n, m, p, x, y, k, kAux, sol, nrSol;
    fin >> n >> m >> p;
    for (int i=1; i<=n; i++)
        for (int j=1; j<=m; j++)
            fin >> matrix[i][j];
    for (int e=0; e<p; e++)
    {
        sol = 8005;
        nrSol = 0;
        fin >> x >> y;
        for (int j=1; j<=m; j++)
        {
            k = 0;
            minAlt.push_back(make_pair(1, j));
            maxAlt.push_back(make_pair(1, j));
            for (int i=2; i<=n; i++)
            {
                while(matrix[minAlt.back().first][minAlt.back().second]>matrix[i][j])
                {
                    minAlt.pop_back();
                    if (minAlt.empty())
                        break;
                }
                minAlt.push_back(make_pair(i ,j));
                if (minAlt.front().first<=i-x)
                    minAlt.pop_front();
                while(matrix[maxAlt.back().first][maxAlt.back().second]<matrix[i][j])
                {
                    maxAlt.pop_back();
                    if (maxAlt.empty())
                        break;
                }
                maxAlt.push_back(make_pair(i ,j));
                if (maxAlt.front().first<=i-x)
                    maxAlt.pop_front();
                if (i>=x)
                {
                    k++;
                    minVal[k][j].x = minAlt.front().first;
                    minVal[k][j].y = minAlt.front().second;
                    maxVal[k][j].x = maxAlt.front().first;
                    maxVal[k][j].y = maxAlt.front().second;
                }
            }
            while(!minAlt.empty())
                minAlt.pop_back();
            while(!maxAlt.empty())
                maxAlt.pop_back();
        }
        for (int i=1; i<=k; i++)
        {
            minAlt.push_back(make_pair(minVal[i][1].x, minVal[i][1].y));
            maxAlt.push_back(make_pair(maxVal[i][1].x, maxVal[i][1].y));
            for (int j=2; j<=m; j++)
            {
                while(matrix[minAlt.back().first][minAlt.back().second]>matrix[minx][miny])
                {
                    minAlt.pop_back();
                    if (minAlt.empty())
                        break;
                }
                while(matrix[maxAlt.back().first][maxAlt.back().second]<matrix[maxx][maxy])
                {
                    maxAlt.pop_back();
                    if (maxAlt.empty())
                        break;
                }
                minAlt.push_back(make_pair(minx, miny));
                maxAlt.push_back(make_pair(maxx, maxy));
                if (minAlt.front().second<=j-y)
                    minAlt.pop_front();
                if (maxAlt.front().second<=j-y)
                    maxAlt.pop_front();
                int dif = (matrix[maxAlt.front().first][maxAlt.front().second]-matrix[minAlt.front().first][minAlt.front().second]);
                if (j>=y)
                {
                    if (sol>dif)
                    {
                        nrSol = 1;
                        sol = dif;
                    }
                    else
                        if (sol==dif)
                            nrSol ++;
                }
            }
            while(!minAlt.empty())
                minAlt.pop_back();
            while(!maxAlt.empty())
                maxAlt.pop_back();
        }
        if (x!=y)
        {
            for (int j=1; j<=m; j++)
            {
                k = 0;
                minAlt.push_back(make_pair(1, j));
                maxAlt.push_back(make_pair(1, j));
                for (int i=2; i<=n; i++)
                {
                    while(matrix[minAlt.back().first][minAlt.back().second]>matrix[i][j])
                    {
                        minAlt.pop_back();
                        if (minAlt.empty())
                            break;
                    }
                    minAlt.push_back(make_pair(i ,j));
                    if (minAlt.front().first<=i-y)
                        minAlt.pop_front();
                    while(matrix[maxAlt.back().first][maxAlt.back().second]<matrix[i][j])
                    {
                        maxAlt.pop_back();
                        if (maxAlt.empty())
                            break;
                    }
                    maxAlt.push_back(make_pair(i ,j));
                    if (maxAlt.front().first<=i-y)
                        maxAlt.pop_front();
                    if (i>=y)
                    {
                        k++;
                        minVal[k][j].x = minAlt.front().first;
                        minVal[k][j].y = minAlt.front().second;
                        maxVal[k][j].x = maxAlt.front().first;
                        maxVal[k][j].y = maxAlt.front().second;
                    }
                }
                while(!minAlt.empty())
                    minAlt.pop_back();
                while(!maxAlt.empty())
                    maxAlt.pop_back();
            }
            for (int i=1; i<=k; i++)
            {
                minAlt.push_back(make_pair(minVal[i][1].x, minVal[i][1].y));
                maxAlt.push_back(make_pair(maxVal[i][1].x, maxVal[i][1].y));
                for (int j=2; j<=m; j++)
                {
                    while(matrix[minAlt.back().first][minAlt.back().second]>matrix[minx][miny])
                    {
                        minAlt.pop_back();
                        if (minAlt.empty())
                            break;
                    }
                    while(matrix[maxAlt.back().first][maxAlt.back().second]<matrix[maxx][maxy])
                    {
                        maxAlt.pop_back();
                        if (maxAlt.empty())
                            break;
                    }
                    minAlt.push_back(make_pair(minx, miny));
                    maxAlt.push_back(make_pair(maxx, maxy));
                    if (minAlt.front().second<=j-x)
                        minAlt.pop_front();
                    if (maxAlt.front().second<=j-x)
                        maxAlt.pop_front();
                    int dif = (matrix[maxAlt.front().first][maxAlt.front().second]-matrix[minAlt.front().first][minAlt.front().second]);
                    if (j>=x)
                    {
                        if (sol>dif)
                        {
                            nrSol = 1;
                            sol = dif;
                        }
                        else
                            if (sol==dif)
                                nrSol ++;
                    }
                }
                while(!minAlt.empty())
                    minAlt.pop_back();
                while(!maxAlt.empty())
                    maxAlt.pop_back();
            }
        }
        cout << sol << " " << nrSol << "\n";
    }
    return 0;
}