Cod sursa(job #2270280)

Utilizator CryshanaGanea Carina Cryshana Data 27 octombrie 2018 10:20:54
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.69 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;


ifstream fin  ("mexitate.in" );
ofstream fout ("mexitate.out");

const int N = 400001, MOD = 1000000007;
int F[N];

int main ()
{
    int n, m, k, l;
    fin >> n >> m >> k >> l;
    vector <int> pq;
    if ( n > m )
    {
        n += m;
        m = n - m;
        n = n - m;
        k += l;
        l = k - l;
        k = k - l;
    }
    int A[n+1][m+1];
    for ( int i = 1; i <= n; i++ )
    {
        for ( int j = 1; j <= m; j++ )
        {
            fin >> A[i][j];
        }
    }
    int prod = 1;
    for ( int i = 1; i <= k; i++ )
    {
        for ( int j = 1; j <= l; j++ )
        {
            F[A[i][j]] ++;
        }
    }
     for ( int i = 1; i <= n*m; i++ )
        {
            if ( F[i] == 0 )
            {
                prod *= i;
                prod %= MOD;
                cout << i << " ";
                break;
            }
        }
    int a = 1, b = l, c;
    bool d = true;
    if (( n - k ) % 2 == 0 )
    {
        c = m;
        d = false;
    }
    else
    {
        c = l;
        d = true;
    }
    bool ok = true;
    while ( !( a == n - k + 1 && b == c ))
    {
        if ( ok && b < m )
        {
            b++;
            for ( int r = a; r < a + k; r++ )
            {
                F[A[r][b-l]] --;
                F[A[r][b]] ++;
            }
        }
        else
        {
            if ( ok && b == m )
            {
                ok = false;
                a++;
                for ( int r = b - l + 1; r <= m; r++ )
                {
                    F[A[a-1][r]] --;
                    F[A[a+k-1][r]] ++;
                }
            }
            else
            {
                if ( !ok && b > l )
                {
                    b--;
                    for ( int r = a; r > a + k; r++ )
                    {
                        F[A[r][b+1]]-- ;
                        F[A[r][b-l+1]] ++;
                    }
                }
                else
                {
                    if ( !ok && b == l)
                    {
                        a++;
                        ok = true;
                        for ( int r = 1; r <= l; r++ )
                        {
                            F[A[a-1][r]] --;
                            F[A[a+k-1][r]] ++;
                        }
                    }
                }
            }
        }
        for ( int i = 1; i <= n*m; i++ )
        {
            if ( F[i] == 0 )
            {
                prod *= i;
                prod %= MOD;
                cout << i <<" ";
                break;
            }
        }
        cout << F[4] << " ";
    }
    fout << prod;
    return 0;
}