Cod sursa(job #2040883)

Utilizator VladG26Ene Vlad-Mihai VladG26 Data 16 octombrie 2017 17:27:49
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.71 kb
#include <iostream>
#include <cstdio>
#include <deque>
using namespace std;
int m,n,p,mCit[1005][1005],mMin[1005][1005],mMax[1005][1005];
pair<int,int> teste[15];
deque<int> ptMin,ptMax;
int solMIN,solNR;
void citire()
{
    int aux1,aux2;
    scanf("%d%d%d",&m,&n,&p);
    for(int i=1; i<=m; i++)
        for(int j=1; j<=n; j++)
            scanf("%d",&mCit[i][j]);
    for(int i=1; i<=p; i++)
    {
        scanf("%d%d",&aux1,&aux2);
        teste[i].first=aux1;
        teste[i].second=aux2;
    }
}
void solver(int x,int y)
{
    for(int i=1; i<=m; i++)
    {
        ptMin.erase(ptMin.begin(),ptMin.end());
        ptMax.erase(ptMax.begin(),ptMax.end());

        for(int j=1; j<=n; j++)
        {
            while(!ptMin.empty()&&mCit[i][ptMin.back()]>=mCit[i][j])
                ptMin.pop_back();
            while(!ptMax.empty()&&mCit[i][ptMax.back()]<=mCit[i][j])
                ptMax.pop_back();

            ptMin.push_back(j);
            ptMax.push_back(j);

            if(j-ptMin.front()+1>y)
                ptMin.pop_front();
            if(j-ptMax.front()+1>y)
                ptMax.pop_front();

            if(j>=y)
            {
                mMin[i][j-y+1]=mCit[i][ptMin.front()];
                mMax[i][j-y+1]=mCit[i][ptMax.front()];
            }
        }
    }

    for(int j=1; j<=n-y+1; j++)
    {
        ptMin.erase(ptMin.begin(),ptMin.end());
        ptMax.erase(ptMax.begin(),ptMax.end());
        for(int i=1; i<=m; i++)
        {
            while(!ptMin.empty()&&mMin[ptMin.back()][j]>=mMin[i][j])
                ptMin.pop_back();
            while(!ptMax.empty()&&mMax[ptMax.back()][j]<=mMax[i][j])
                ptMax.pop_back();

            ptMin.push_back(i);
            ptMax.push_back(i);

            if(i-ptMin.front()+1>x)
                ptMin.pop_front();
            if(i-ptMax.front()+1>x)
                ptMax.pop_front();

            if(i>=x)
            {
                if(mMax[ptMax.front()][j]-mMin[ptMin.front()][j]==solMIN)
                {
                    solNR++;
                }
                if(mMax[ptMax.front()][j]-mMin[ptMin.front()][j]<solMIN)
                {
                    solMIN=mMax[ptMax.front()][j]-mMin[ptMin.front()][j];
                    solNR=1;
                }
            }
        }
    }
}
int main()
{
    freopen("struti.in","r",stdin);
    freopen("struti.out","w",stdout);
    citire();
    for(int i=1; i<=p; i++)
    {
        solMIN=0x3f3f3f,solNR=0;
        solver(teste[i].first,teste[i].second);
        if(teste[i].first!=teste[i].second)
            solver(teste[i].second,teste[i].first);
        printf("%d %d\n",solMIN,solNR);
    }
    return 0;
}