Cod sursa(job #2807451)

Utilizator BlueLuca888Girbovan Robert Luca BlueLuca888 Data 23 noiembrie 2021 20:13:59
Problema Struti Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.9 kb
#include <bits/stdc++.h>

using namespace std;

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

const short DIM = 500;
short mat[DIM][DIM];
short n, m, q, a, b, minn;
int sol;

short lg2[DIM], rmq[DIM][9][DIM][9], RMQ[DIM][9][DIM][9];

void calc_log2(){
    lg2[1]=0;
    for(short i=2; i < DIM; i++)
        lg2[i] = lg2[i>>1] + 1;
}

void calc_rmq(){
    short lgN = lg2[n], lgM = lg2[m], ii, jj;

    //init
    for(short i=1; i<=n; i++){

        for(short j=1; j<=m; j++)
            rmq[i][0][j][0] = RMQ[i][0][j][0] = mat[i][j];

        for(short pj=1; pj<=lgM; pj++) //mergem pana la log2(m)
            for(short j=1; (jj=j+(1<<(pj-1))) <= m; j++) //jj <= m
                rmq[i][0][j][pj] = min(rmq[i][0][j][pj-1], rmq[i][0][jj][pj-1]),
                RMQ[i][0][j][pj] = max(RMQ[i][0][j][pj-1], RMQ[i][0][jj][pj-1]);
    }


    for(short pi=1; pi<=lgN; pi++) //mergem pana la log2(n)
        for(short i=1; (ii=i+(1<<(pi-1))) <= n; i++) //ii <= n
            for(short pj=0; pj<=lgM; pj++) //mergem pana la log2(m)
                for(short j=1; j <= m; j++) //mergem pana la m
                    rmq[i][pi][j][pj] = min(rmq[i][pi-1][j][pj], rmq[ii][pi-1][j][pj]),
                    RMQ[i][pi][j][pj] = max(RMQ[i][pi-1][j][pj], RMQ[ii][pj-1][j][pj]);
}

short _min(short a, short b, short c, short d){
    return min(a, min(b, min(c, d)));
}

short getMin(short i, short j, short ii, short jj){
    short pi = lg2[ii - i + 1];
    short pj = lg2[jj - j + 1];
    ii = ii - (1<<pi) + 1;
    jj = jj - (1<<pj) + 1;

    return _min(
        rmq[i][pi][j][pj],
        rmq[i][pi][jj][pj],
        rmq[ii][pi][j][pj],
        rmq[ii][pi][jj][pj]
    );
}

short _max(short a, short b, short c, short d){
    return max(a, max(b, max(c, d)));
}

short getMax(short i, short j, short ii, short jj){
    short pi = lg2[ii - i + 1];
    short pj = lg2[jj - j + 1];
    ii = ii - (1<<pi) + 1;
    jj = jj - (1<<pj) + 1;

    return _max(
        RMQ[i][pi][j][pj],
        RMQ[i][pi][jj][pj],
        RMQ[ii][pi][j][pj],
        RMQ[ii][pi][jj][pj]
    );
}

void solve(short a, short b){
    short ii, jj, mn, mx;
    for(short i=1; i<=n-a+1; i++)
        for(short j=1; j<=m-b+1; j++){
            ii = i + a - 1;
            jj = j + b - 1;

            mn = getMin(i, j, ii, jj);
            mx = getMax(i, j, ii, jj);

            if(mx - mn < minn){
                minn = mx - mn;
                sol=1;
            }else if(mx - mn == minn)
                sol++;
        }
}

signed main (){
    fin>>n>>m>>q;
    for(short i=1; i<=n; i++)
        for(short j=1; j<=m; j++)
            fin>>mat[i][j];


    calc_log2();
    calc_rmq();

    while(q--){
        fin>>a>>b;
        minn = 10050; sol=0;
        solve(a, b);
        if(a != b)
            solve(b, a);
        fout<<minn<<" "<<sol<<"\n";
    }
    return 0;
}