Cod sursa(job #1077109)

Utilizator costel93FMI - Dumea Eduard Constantin costel93 Data 10 ianuarie 2014 21:45:24
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <fstream>

using namespace std;

int n, i, j, dx, dy, nrs, rz, a[1005][1005], dq1[1005], dq2[1005], b[1005][1005][2], m, p;

void solve(int dx, int dy)
{
    int i, j, s1, s2, f1, f2;

    for (i = 1; i <= n; i ++)
    {
        s1 = 1; s2 = 1; f1 = 0; f2 = 0;

        for (j = 1; j <= m; j ++)
        {
            while( s1 <= f1 && a[i][j] <= a[i][dq1[f1]] ) --f1;

            dq1[++f1] = j;

            if( dq1[s1] <= j - dx ) ++s1;

            while( s2 <= f2 && a[i][j] >= a[i][dq2[f2]] ) --f2;

            dq2[++f2] = j;

            if( dq2[s2] <= j - dx ) ++s2;

            if( j >= dx)
            {
                b[i][j - dx + 1][0] = a[i][dq1[s1]];
                b[i][j - dx + 1][1] = a[i][dq2[s2]];
            }

        }
    }

    int qs1, qs2, qf1, qf2;
    for (j = 1; j <= m - dx + 1; j ++)
    {
        s1 = 1; s2 = 1; f1 = 0; f2 = 0;

        for (i = 1; i <= n; i ++)
        {

            while( s1 <= f1 && b[i][j][0] <= b[dq1[f1]][j][0] ) --f1;

            dq1[++f1] = i;

            if( dq1[s1] <= i - dy ) ++s1;

            while( s2 <= f2 && b[i][j][1] >= b[dq2[f2]][j][1] )  --f2;

            dq2[++f2] = i;

            if( dq2[s2] <= i - dy ) ++s2;

            if (i >= dy){
                if (b[dq2[s2]][j][1] - b[dq1[s1]][j][0] < rz)
                {
                    rz = b[dq2[s2]][j][1] - b[dq1[s1]][j][0];
                    nrs = 0;
                }
                if (b[dq2[s2]][j][1] - b[dq1[s1]][j][0] == rz)
                    nrs ++;
            }
        }
    }
}

int main()
{
    ifstream fin("struti.in");
    ofstream fout("struti.out");

    fin>>n>>m>>p;

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

    for(int i = 1; i<= p; ++i)
    {
        fin>>dx>>dy;

        rz =  1000000;

        solve(dx, dy);
        if (dx != dy)
            solve(dy, dx);

        fout<<rz<<" "<<nrs<<"\n";
    }

    return 0;
}