Cod sursa(job #3334931)

Utilizator CC2023Cezar Cirjau CC2023 Data 20 ianuarie 2026 18:24:50
Problema Struti Scor 90
Compilator cpp-64 Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 4.27 kb
#include <bits/stdc++.h>

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

deque<long long> maxi[1001], mini[1001];
long long w[1001][1001], n, m, p, dx, dy, nr, minim, minix[1001][1001], maxix[1001][1001], miniy[1001][1001], maxiy[1001][1001], aux;
void func()
{
    for(int k=0; k<dx; k++)
    {
        for(int j=0; j<m; j++)
        {
            while(!maxi[j].empty()&&w[maxi[j].back()][j]<=w[k][j])
            {
                maxi[j].pop_back();
            }
            maxi[j].push_back(k);
            while(!mini[j].empty()&&w[mini[j].back()][j]>=w[k][j])
            {
                mini[j].pop_back();
            }
            mini[j].push_back(k);
        }
    }
    for(int k=0; k<=n-dx; k++)
    {
        for(int j=0; j<m; j++)
        {
            while(!maxi[j].empty()&&w[maxi[j].back()][j]<=w[k+dx-1][j])
            {
                maxi[j].pop_back();
            }
            maxi[j].push_back(k+dx-1);
            while(!mini[j].empty()&&w[mini[j].back()][j]>=w[k+dx-1][j])
            {
                mini[j].pop_back();
            }
            mini[j].push_back(k+dx-1);
            minix[k][j]=w[mini[j].front()][j];
            maxix[k][j]=w[maxi[j].front()][j];
            if(maxi[j].front()==k)
            {
                maxi[j].pop_front();
            }
            if(mini[j].front()==k)
            {
                mini[j].pop_front();
            }
        }
    }
    for(int j=0; j<m; j++)
    {
        while(!maxi[j].empty())
        {
            maxi[j].pop_front();
        }
        while(!mini[j].empty())
        {
            mini[j].pop_front();
        }
    }
    for(int k=0; k<=n-dx; k++)
    {
        for(int j=0; j<dy; j++)
        {
            while(!maxi[k].empty()&&maxix[k][maxi[k].back()]<=maxix[k][j])
            {
                maxi[k].pop_back();
            }
            maxi[k].push_back(j);
            while(!mini[k].empty()&&minix[k][mini[k].back()]>=minix[k][j])
            {
                mini[k].pop_back();
            }
            mini[k].push_back(j);
        }
    }
    for(int k=0; k<=n-dx; k++)
    {
        for(int j=0; j<=m-dy; j++)
        {
            while(!maxi[k].empty()&&maxix[k][maxi[k].back()]<=maxix[k][j+dy-1])
            {
                maxi[k].pop_back();
            }
            maxi[k].push_back(j+dy-1);
            while(!mini[k].empty()&&minix[k][mini[k].back()]>=minix[k][j+dy-1])
            {
                mini[k].pop_back();
            }
            mini[k].push_back(j+dy-1);
            miniy[k][j]=minix[k][mini[k].front()];
            maxiy[k][j]=maxix[k][maxi[k].front()];
            if(maxi[k].front()==j)
            {
                maxi[k].pop_front();
            }
            if(mini[k].front()==j)
            {
                mini[k].pop_front();
            }
        }
    }
    for(int j=0; j<m; j++)
    {
        while(!maxi[j].empty())
        {
            maxi[j].pop_front();
        }
        while(!mini[j].empty())
        {
            mini[j].pop_front();
        }
    }
    /*for(int k=0; k<=n-dx; k++)
    {
        for(int j=0; j<=m-dy; j++)
        {
            fout<<miniy[k][j]<<" ";
        }
        fout<<"\n";
    }
    fout<<"\n";
    for(int k=0; k<=n-dx; k++)
    {
        for(int j=0; j<=m-dy; j++)
        {
            fout<<maxiy[k][j]<<" ";
        }
        fout<<"\n";
    }
    fout<<"\n\n";*/
    for(int k=0; k<=n-dx; k++)
    {
        for(int j=0; j<=m-dy; j++)
        {
            if(maxiy[k][j]-miniy[k][j]<minim)
            {
                minim=maxiy[k][j]-miniy[k][j];
                nr=0;
            }
            if(maxiy[k][j]-miniy[k][j]==minim)
            {
                nr++;
            }
        }
    }
}
int main()
{
    fin>>n>>m>>p;
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<m; j++)
        {
            fin>>w[i][j];
        }
    }
    for(int i=0; i<p; i++)
    {
        fin>>dy>>dx;
        minim=10000000;
        nr=0;
        func();
        if(dx!=dy)
        {
            aux=dx;
            dx=dy;
            dy=aux;
            func();
        }
        fout<<minim<<" "<<nr<<"\n";
    }
    return 0;
}