Cod sursa(job #3341179)

Utilizator serbanbBrindescu Serban serbanb Data 18 februarie 2026 12:44:34
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.87 kb
#include <fstream>
#include <deque>

using namespace std;

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

int n,m,p;
int A[1005][1005];
int maxr[1005][1005];
int maxrc[1005][1005];
int minr[1005][1005];
int minrc[1005][1005];
deque <int> dqmax, dqmin;
int mindxy, cntxy;
int mindyx, cntyx;

void read()
{
    fin >> n >> m >> p;
    for(int i = 1; i <= n; ++i){
        for(int j = 1; j <= m; ++j){
            fin >> A[i][j];
        }
    }
}

void buildr(int x)
{
    for(int i = 1; i <= n; ++i){
        for(int j = 1; j <= m; ++j){
            maxr[i][j] = minr[i][j] = 0;
        }
    }
    for(int i = 1; i <= n; ++i){
        dqmax.clear();
        dqmin.clear();
        for(int j = 1; j <= m; ++j){
            while(!dqmax.empty() && A[i][dqmax.back()] <= A[i][j]){
                dqmax.pop_back();
            }
            dqmax.push_back(j);
            if(dqmax.front() <= j - x){
                dqmax.pop_front();
            }
            if(j >= x){
                maxr[i][j] = A[i][dqmax.front()];
            }
            while(!dqmin.empty() && A[i][dqmin.back()] >= A[i][j]){
                dqmin.pop_back();
            }
            dqmin.push_back(j);
            if(dqmin.front() <= j - x){
                dqmin.pop_front();
            }
            if(j >= x){
                minr[i][j] = A[i][dqmin.front()];
            }
        }
    }
}

void buildrc(int x, int y)
{
    for(int i = 1; i <= n; ++i){
        for(int j = 1; j <= m; ++j){
            maxrc[i][j] = minrc[i][j] = 0;
        }
    }
    for(int j = x; j <= m; ++j){
        dqmax.clear();
        dqmin.clear();
        for(int i = 1; i <= n; ++i){
            while(!dqmax.empty() && maxr[dqmax.back()][j] <= maxr[i][j]){
                dqmax.pop_back();
            }
            dqmax.push_back(i);
            if(dqmax.front() <= i - y){
                dqmax.pop_front();
            }
            if(i >= y){
                maxrc[i][j] = maxr[dqmax.front()][j];
            }
            while(!dqmin.empty() && minr[dqmin.back()][j] >= minr[i][j]){
                dqmin.pop_back();
            }
            dqmin.push_back(i);
            if(dqmin.front() <= i - y){
                dqmin.pop_front();
            }
            if(i >= y){
                minrc[i][j] = minr[dqmin.front()][j];
            }
        }
    }
}

void setMinDxy(int x, int y)
{
    buildr(x);
    buildrc(x, y);
    mindxy = 8000;
    cntxy = 0;
    for(int i = y; i <= n; ++i){
        for(int j = x; j <= m; ++j){
            if(maxrc[i][j] - minrc[i][j] < mindxy){
                mindxy = maxrc[i][j] - minrc[i][j];
                cntxy = 1;
            }
            else if(maxrc[i][j] - minrc[i][j] == mindxy){
                ++cntxy;
            }
        }
    }
}

void setMinDyx(int y, int x)
{
    buildr(x);
    buildrc(x, y);
    mindyx = 8000;
    cntyx = 0;
    for(int i = y; i <= n; ++i){
        for(int j = x; j <= m; ++j){
            if(maxrc[i][j] - minrc[i][j] < mindyx){
                mindyx = maxrc[i][j] - minrc[i][j];
                cntyx = 1;
            }
            else if(maxrc[i][j] - minrc[i][j] == mindyx){
                ++cntyx;
            }
        }
    }
}

void runAlgorithm()
{
    for(int i = 0; i < p; ++i){
        int dx,dy;
        fin >> dx >> dy;
        setMinDxy(dx, dy);
        setMinDyx(dx, dy);
        if(mindxy < mindyx){
            fout << mindxy << ' ' << cntxy << '\n';
        }
        else if(mindxy > mindyx){
            fout << mindyx << ' ' << cntyx << '\n';
        }
        else if(dx != dy){
            fout << mindyx << ' ' << cntyx + cntxy << '\n';
        }
        else{
            fout << mindyx << ' ' << cntyx << '\n';
        }
    }
}

int main()
{
    read();
    runAlgorithm();
    return 0;
}