Cod sursa(job #1083535)

Utilizator andreivFMI - vacaroiu andrei andreiv Data 16 ianuarie 2014 02:38:43
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.49 kb
#include <cstdio>
#include <deque>
using namespace std;
int countt, a[1003][1003], n, m, ml_col[1003], ML_col[1003];

int solve(int L , int l)
{
    int sol = 99999999;
    deque<int> MM[1003], mm[1003];
    for (int j = 1; j <= m; ++j)
        for (int i = 1; i < l; ++i)
        {
            while (!MM[j].empty() && a[MM[j].back()][j] <= a[i][j])
                MM[j].pop_back();
            MM[j].push_back(i);
            while (!mm[j].empty() && a[mm[j].back()][j] >= a[i][j])
                mm[j].pop_back();
            mm[j].push_back(i);
        }
    for (int i = l; i <= n; ++i)
    {
        deque<int> rez, ML, ml;
        for (int j = 1; j <= m; ++j)
        {
            while (!MM[j].empty() && a[MM[j].back()][j] <= a[i][j])
                MM[j].pop_back();
            MM[j].push_back(i);
            if (MM[j].front() <= i - l)
                MM[j].pop_front();

            while (!mm[j].empty() && a[mm[j].back()][j] >= a[i][j])
                mm[j].pop_back();
            mm[j].push_back(i);
            if (mm[j].front() <= i - l)
                mm[j].pop_front();

            ml_col[j] = a[mm[j].front()][j], ML_col[j] = a[MM[j].front()][j];
            while (!ML.empty() && ML_col[ML.back()] <= ML_col[j])
                ML.pop_back();
            ML.push_back(j);
            if (ML.front() <= j - L) ML.pop_front();

            while (!ml.empty() && ml_col[ml.back()] >= ml_col[j])
                ml.pop_back();
            ml.push_back(j);
            if (ml.front() <= j - L) ml.pop_front();

            if (j >= L)
            {
                if (ML_col[ML.front()] - ml_col[ml.front()] < sol)
                    sol = ML_col[ML.front()] - ml_col[ml.front()], countt = 1;
                    else
                    if (ML_col[ML.front()] - ml_col[ml.front()] == sol)
                        ++countt;
            }
        }
    }
 return sol;
}


int main()
{
    int k;

    freopen("struti.in", "r", stdin);
    freopen("struti.out", "w", stdout);
    scanf("%d %d %d", &n, &m, &k);
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= m; ++j)
            scanf("%d", &a[i][j]);
    for (int i = 1; i <= k; ++i)
    {
        int l, L, sol, nr;
        scanf("%d %d", &L, &l);
        sol = solve(L, l); nr = countt;
        if (l != L)
        {
            l = solve(l, L);
            if (l == sol)
                nr += countt;
            else
                if (l < sol)
                    sol = l, nr = countt;
        }
        printf("%d %d\n", sol, nr);
    }
return 0;

}