Cod sursa(job #1502144)

Utilizator mirupetPetcan Miruna mirupet Data 14 octombrie 2015 11:28:36
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.82 kb
#include<cstdio>
#include<deque>
#include<cstring>
#define INF (1 << 30)
using namespace std;

int N, M, P, X, Y;
int v[1002][1002], Min[1002][1002], Max[1002][1002];
deque <int> deq, DEQ;

int Solve(int, int, int &);

int main()
    {
        freopen("struti.in","r",stdin);
        freopen("struti.out","w",stdout);

        int i, j, A, B, NR1, NR2;
        scanf("%d%d%d", &N, &M, &P);

        for (i = 1; i <= N; i++)
            for (j = 1; j <= M; j++)
                scanf("%d", &v[i][j]);

        for ( ; P; P--)
        {
            scanf("%d%d", &X, &Y);

            A = Solve(X, Y, NR1);
            B = Solve(Y, X, NR2);

            if (A < B)
                printf("%d %d\n", A, NR1);
            else
                if (A > B)
                    printf("%d %d\n", B, NR2);
            else
                if (X != Y)
                    printf("%d %d\n", A, NR1 + NR2);
                else
                    printf("%d %d\n", A, NR1);
        }
    }

int Solve(int x, int y, int &nr)
{
    int i, j;

    memset(Min, 0, sizeof(Min));
    memset(Max, 0, sizeof(Max));

    for (int i = 1; i <= N; i++)
    {
        deq.resize(0);
        DEQ.resize(0);

        for (int j = 1; j <= M; j++)
        {
            if (!deq.empty() && j - deq.front() == y)
                deq.pop_front();
            if (!DEQ.empty() && j - DEQ.front() == y)
                DEQ.pop_front();

            while (!deq.empty() && v[i][j] <= v[i][deq.back()])
                deq.pop_back();
            while (!DEQ.empty() && v[i][j] >= v[i][DEQ.back()])
                DEQ.pop_back();

            deq.push_back(j);
            DEQ.push_back(j);

            if (j >= y)
            {
                Min[i][j] = v[i][deq.front()];
                Max[i][j] = v[i][DEQ.front()];
            }
        }
    }

    nr = 0; int sol = INF;

    for (j = y; j <= M; j++)
    {
        deq.resize(0);
        DEQ.resize(0);

        for (i = 1; i <= N; i++)
        {
            if (!deq.empty() && i - deq.front() == x)
                deq.pop_front();
            if (!DEQ.empty() && i - DEQ.front() == x)
                DEQ.pop_front();

            while (!deq.empty() && Min[i][j] <= Min[deq.back()][j])
                deq.pop_back();
            while (!DEQ.empty() && Max[i][j] >= Max[DEQ.back()][j])
                DEQ.pop_back();

            deq.push_back(i);
            DEQ.push_back(i);

            if (i >= x)
            {
                if (Max[DEQ.front()][j] - Min[deq.front()][j] < sol)
                    sol = Max[DEQ.front()][j] - Min[deq.front()][j], nr = 1;
                else
                    if (Max[DEQ.front()][j] - Min[deq.front()][j] == sol)
                        nr++;
            }
        }
    }
    return sol;
}