Cod sursa(job #3234933)

Utilizator Andreea1501013Andreea Andreea1501013 Data 12 iunie 2024 18:50:01
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.55 kb
#include <bits/stdc++.h>
#include<deque>
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
int ma[1005][1005],fr[10000],final_min[1005][1005],final_max[1005][1005],N,M;
 int l1=0,c1;
void DQ_min(int l,int c)
{
    deque<int> dq;
    for(int i=0;i<N;i++)
    {
        c1=0;
        for(int j=0;j<M;j++)
        {
            while(dq.empty()==0 && ma[i][j]<ma[i][dq.back()])
            {
                dq.pop_back();
            }
            dq.push_back(j);
            if(dq.empty()==0 && dq.front()<=j-c)
            {
                dq.pop_front();
            }
            if(j>=c-1)
            {
                final_min[i][c1]=ma[i][dq.front()];
                c1++;
            }
        }
        dq.clear();
    }
    dq.clear();
    for(int j=0;j<c1;j++)
    {
        l1=0;
        for(int i=0;i<N;i++)
        {
            while(dq.empty()==0 && final_min[i][j]<final_min[dq.back()][j])
            {
                dq.pop_back();
            }
            dq.push_back(i);
            if(dq.empty()==0 && dq.front()<=i-l)
            {
                dq.pop_front();
            }
            if(i>=l-1)
            {
                final_min[l1][j]=final_min[dq.front()][j];
                l1++;
            }
        }
        dq.clear();
    }
}
void DQ_max(int l,int c)
{
    int l2=0,c2=0;
    deque<int> dq;
    for(int i=0;i<N;i++)
    {
        c2=0;
        for(int j=0;j<M;j++)
        {
            while(dq.empty()==0 && ma[i][j]>ma[i][dq.back()])
            {
                dq.pop_back();
            }
            dq.push_back(j);
            if(dq.empty()==0 && dq.front()<=j-c)
            {
                dq.pop_front();
            }
            if(j>=c-1)
            {
                final_max[i][c2]=ma[i][dq.front()];
                c2++;
            }
        }
        dq.clear();
    }
    dq.clear();
    for(int j=0;j<c2;j++)
    {
        l2=0;
        for(int i=0;i<N;i++)
        {
            while(dq.empty()==0 && final_max[i][j]>final_max[dq.back()][j])
            {
                dq.pop_back();
            }
            dq.push_back(i);
            if(dq.empty()==0 && dq.front()<=i-l)
            {
                dq.pop_front();
            }
            if(i>=l-1)
            {
                final_max[l2][j]=final_max[dq.front()][j];
                l2++;
            }
        }
        dq.clear();
    }
}

int main()
{
    int P,DX,DY;
    fin>>N>>M>>P;
    for(int i=0;i<N;i++)
    {
        for(int j=0;j<M;j++)
        {
            fin>>ma[i][j];
        }
    }
    while(P--)
    {
        fin>>DX>>DY;
        short int ok=0;
        int cnt=0,mini=8005;
        while(ok<2)
        {
            if(ok==1)
            {
                swap(DX,DY);
            }
            DQ_min(DX,DY);
            DQ_max(DX,DY);
            for(int x=0;x<l1;x++)
            {
                for(int y=0;y<c1;y++)
                {
                    if(final_max[x][y]-final_min[x][y]<mini)
                    {
                        mini=final_max[x][y]-final_min[x][y];
                        cnt=1;
                    }
                    else if(final_max[x][y]-final_min[x][y]==mini)
                    {
                        cnt++;
                    }
                }
            }
            ok++;
            if(DX==DY)
            {
                break;
            }

        }
        fout<<mini<<' '<<cnt<<endl;
    }
    return 0;
}