Cod sursa(job #1597369)

Utilizator ZenusTudor Costin Razvan Zenus Data 11 februarie 2016 22:06:00
Problema Struti Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.65 kb
#include <bits/stdc++.h>

using namespace std;

const int bsize = (1 << 20);

deque < int > mn , mx;
int a[1009][1009] , cmn[1009][1009] , cmx[1009][1009];
int n , m , dx , dy , result , i , j , p;
pair < int  , int > fa , sa;
char buffer[bsize] , bpos;

pair < int , int > solve(int dx , int dy)
{
    int i , j , result , pos , c0;

    for (i = 1 ; i <= m ; ++i)
    {
        while (mn.size()) mn.pop_back();
        while (mx.size()) mx.pop_back();

        for (j = 1 ; j <= n ; ++j)
        {
            if (mn.front() <= j - dx) mn.pop_front();
            if (mx.front() <= j - dx) mx.pop_front();

            while (mn.size() && a[mn.back()][i] >= a[j][i]) mn.pop_back();
            while (mx.size() && a[mx.back()][i] <= a[j][i]) mx.pop_back();

            mn.push_back(j);
            mx.push_back(j);

            cmn[j][i] = a[mn.front()][i];
            cmx[j][i] = a[mx.front()][i];
        }
    }

    result = 8009; pos = 0;
    for (i = dx ; i <= n ; ++i)
    {
        while (mn.size()) mn.pop_back();
        while (mx.size()) mx.pop_back();

        for (j = 1 ; j <= m ; ++j)
        {
            if (mn.front() <= j - dy) mn.pop_front();
            if (mx.front() <= j - dy) mx.pop_front();

            while (mn.size() && cmn[i][mn.back()] >= cmn[i][j]) mn.pop_back();
            while (mx.size() && cmx[i][mx.back()] <= cmx[i][j]) mx.pop_back();

            mn.push_back(j);
            mx.push_back(j);

            if (j >= dy)
            {
                c0 = cmx[i][mx.front()] - cmn[i][mn.front()];
                if (c0 < result) result = c0 , pos = 0;
                if (c0 == result) pos++;
            }
        }
    }

    return make_pair(result , pos);
}

int readint()
{
    int x = 0;

    while (!('0' <= buffer[bpos] && buffer[bpos] <= '9'))
    {
        bpos++;
        if (bpos == bsize) fread(buffer , 1 , bsize , stdin);
    }

    while ('0' <= buffer[bpos] && buffer[bpos] <= '9')
    {
        x = 10 * x + buffer[bpos] - '0';
        bpos++;
        if (bpos == bsize) fread(buffer , 1 , bsize , stdin);
    }

    return x;
}

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

fread(buffer , 1 , bsize , stdin);

n = readint();
m = readint();
p = readint();

for (i = 1 ; i <= n ; ++i)
for (j = 1 ; j <= m ; ++j)
a[i][j] = readint();

for (i = 1 ; i <= p ; ++i)
{
    dx = readint();
    dy = readint();

    fa = solve(dx , dy);

    if (dx == dy)
    {
        printf("%d %d\n" , fa.first , fa.second);
        continue;
    }

    sa = solve(dy , dx);

    if (fa.first == sa.first) fa.second += sa.second;
    if (fa.first > sa.first) fa = sa;

    printf("%d %d\n" , fa.first , fa.second);
}

return 0;
}