Cod sursa(job #2910348)

Utilizator cincadavidCinca David Andrei cincadavid Data 19 iunie 2022 18:20:09
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.63 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <deque>

using namespace std;

ifstream cin("struti.in");
ofstream cout("struti.out");

int n,m,q;
int mat[1000][1000];
int matmin[1000][1000];
int matmax[1000][1000];
deque<int>qmin;
deque<int>qmax;
int minn;
int cnt=0;

void Solve(int x,int y)
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            matmin[i][j]=0;
            matmax[i][j]=0;
        }
    }
    minn=8001;
    cnt=0;
    for(int j=0;j<m;j++)
    {
        for(int i=0;i<x;i++)
        {
            while(!qmin.empty() && mat[i][j]<=mat[qmin.back()][j])
            {
                qmin.pop_back();
            }
            qmin.push_back(i);
            while(!qmax.empty() && mat[i][j]>=mat[qmax.back()][j])
            {
                qmax.pop_back();
            }
            qmax.push_back(i);
        }
        for(int i=x;i<n;i++)
        {
            matmin[i-x][j]=mat[qmin.front()][j];
            matmax[i-x][j]=mat[qmax.front()][j];
            while(!qmin.empty() && qmin.front()<=i-x)
            {
                qmin.pop_front();
            }
            while(!qmin.empty() && mat[i][j]<=mat[qmin.back()][j])
            {
                qmin.pop_back();
            }
            qmin.push_back(i);
            while(!qmax.empty() && qmax.front()<=i-x)
            {
                qmax.pop_front();
            }
            while(!qmax.empty() && mat[i][j]>=mat[qmax.back()][j])
            {
                qmax.pop_back();
            }
            qmax.push_back(i);
        }
        matmin[n-x][j]=mat[qmin.front()][j];
        matmax[n-x][j]=mat[qmax.front()][j];
        qmin.clear();
        qmax.clear();
    }
    for(int i=0;i<n-x+1;i++)
    {
        for(int j=0;j<y;j++)
        {
            while(!qmin.empty() && matmin[i][j]<=matmin[i][qmin.back()])
            {
                qmin.pop_back();
            }
            qmin.push_back(j);
            while(!qmax.empty() && matmax[i][j]>=matmax[i][qmax.back()])
            {
                qmax.pop_back();
            }
            qmax.push_back(j);
        }
        for(int j=y;j<m;j++)
        {
            //cout<<"*"<<matmin[i][qmin.front()]<<" "<<matmax[i][qmax.front()]<<"*\n";
            if(matmax[i][qmax.front()]-matmin[i][qmin.front()]<minn)
            {
                cnt=1;
                minn=matmax[i][qmax.front()]-matmin[i][qmin.front()];
            }
            else if(matmax[i][qmax.front()]-matmin[i][qmin.front()]==minn)
            {
                cnt++;
            }
            while(!qmin.empty() && qmin.front()<=j-y)
            {
                qmin.pop_front();
            }
            while(!qmin.empty() && matmin[i][j]<=matmin[i][qmin.back()])
            {
                qmin.pop_back();
            }
            qmin.push_back(j);
            while(!qmax.empty() && qmax.front()<=j-y)
            {
                qmax.pop_front();
            }
            while(!qmax.empty() && matmax[i][j]>=matmax[i][qmax.back()])
            {
                qmax.pop_back();
            }
            qmax.push_back(j);
        }
        //cout<<"*"<<matmin[i][qmin.front()]<<" "<<matmax[i][qmax.front()]<<"*\n";
        if(matmax[i][qmax.front()]-matmin[i][qmin.front()]<minn)
        {
            cnt=1;
            minn=matmax[i][qmax.front()]-matmin[i][qmin.front()];
        }
        else if(matmax[i][qmax.front()]-matmin[i][qmin.front()]==minn)
        {
            cnt++;
        }
        qmin.clear();
        qmax.clear();
    }
}

void printmatmin()
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            cout<<matmin[i][j]<<" ";
        }
        cout<<"\n";
    }
}

void printmatmax()
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            cout<<matmax[i][j]<<" ";
        }
        cout<<"\n";
    }
}

int main()
{
    cin>>n>>m>>q;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            cin>>mat[i][j];
        }
    }
    int x,y;
    for(int i=0;i<q;i++)
    {
        cin>>x>>y;
        Solve(x,y);
        if(x==y)
        {
            cout<<minn<<" "<<cnt<<"\n";
            continue;
        }
        int smin1=minn,scnt1=cnt;
        Solve(y,x);
        int smin2=minn,scnt2=cnt;
        if(smin1<smin2)
            cout<<smin1<<" "<<scnt1<<"\n";
        else if(smin2<smin1)
            cout<<smin2<<" "<<scnt2<<"\n";
        else if(smin1==smin2)
            cout<<smin1<<" "<<scnt1+scnt2<<"\n";
    }

    return 0;
}