Cod sursa(job #1492792)

Utilizator alex_HarryBabalau Alexandru alex_Harry Data 28 septembrie 2015 10:48:29
Problema Struti Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.65 kb
#include <fstream>
using namespace std;
ifstream f("srtuti.in");
ofstream g("struti.out");
int N,M,nb;
int Matrix[1005][1005],P,ans,Max[1005][1005],Min[1005][1005],Begin[2][1005],End[2][1005],MMax[1005],MMin[1005],BeginMin=1,BeginMax=1,EndMax,EndMin;
void Read()
{
    f>>N>>M>>P;
    for(int i=1;i<=N;i++)
        for(int j=1;j<=M;j++)
            f>>Matrix[i][j],Begin[0][i]=Begin[1][i]=1;
}
void Update(int L,int C)
{
    for(int i=1;i<=N;i++)
    {
        while(BeginMax<=EndMax && Matrix[i][Max[i][Begin[0][i]]]>=MMax[EndMax])
            --EndMax;
        MMax[++EndMax]=i;
        if(BeginMax==i-L)
            ++BeginMax;
        while(BeginMin<=EndMin && Matrix[i][Min[i][Begin[1][i]]]<=MMin[EndMin])
            --EndMin;
        MMax[++EndMin]=i;
        if(BeginMin==i-L)
            ++BeginMin;
        int line1=MMax[BeginMax],line2=MMin[BeginMin];
        if(ans==Matrix[line1][Max[line1][Begin[0][line1]]]-Matrix[line2][Min[line2][Begin[1][line2]]])
            ++nb;
        if(ans<Matrix[line1][Max[line1][Begin[0][line1]]]-Matrix[line2][Min[line2][Begin[1][line2]]])
        {
            ans=Matrix[line1][Max[line1][Begin[0][line1]]]-Matrix[line2][Min[line2][Begin[1][line2]]];
            nb=1;
        }
        ans=max(ans,Matrix[line1][Max[line1][Begin[0][line1]]]-Matrix[line2][Min[line2][Begin[1][line2]]]);
    }
}
void Solve(int L,int C)
{
    for(int i=1;i<=N;i++)
    {
        for(int j=1;j<=C;j++)
        {
            while(Begin[0][i]<=End[0][i] && Matrix[i][j]>=Matrix[i][Max[i][End[0][i]]])
                --End[0][i];
            Max[i][++End[0][i]]=j;
            while(Begin[1][i]<=End[1][i] && Matrix[i][j]<=Matrix[i][Min[i][End[1][i]]])
                --End[0][i];
            Min[i][++End[0][i]]=j;
        }
    }
    Update(L,C);
    for(int j=C+1;j<=M;j++)
    {
        for(int i=1;i<=N;i++)
        {
            while(Begin[0][i]<=End[0][i] && Matrix[i][j]>=Matrix[i][Max[i][End[0][i]]])
                --End[0][i];
            Max[i][++End[0][i]]=j;
            if(Begin[0][i]==j-C)
                ++Begin[0][i];
            while(Begin[1][i]<=End[1][i] && Matrix[i][j]<=Matrix[i][Min[i][End[1][i]]])
                --End[0][i];
            Min[i][++End[0][i]]=j;
            if(Begin[1][i]==j-C)
                ++Begin[1][i];
        }
        Update(L,C);
    }
    g<<ans<<" "<<nb<<"\n";
}
int main()
{
    Read();
    for(int i=1;i<=P;i++)
    {
        int L,C;
        f>>L>>C;
        Solve(L,C);
        ans=nb=0;
        for(int i=1;i<=N;i++)
            Begin[0][i]=Begin[1][i]=BeginMax=BeginMin=1,End[0][i]=End[1][i]=EndMin=EndMax=0;
    }
    return 0;
}