Cod sursa(job #2064599)

Utilizator armigheGheorghe Liviu Armand armighe Data 12 noiembrie 2017 16:13:17
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.78 kb
#include<cstdio>
#include<fstream>
using namespace std;
FILE *f=fopen("struti.in","r");
ofstream g("struti.out");
int a[1002][1002],b[1002][1002],minim[1002][1002],maxim[1002][1002],v[1002],m,n,sol,k;

void Deque(int x,int y)
{
    int Front,Back,i,j;
    //minim
    Front = 1, Back = 0; // Initializare, Back < Front => deque-ul este vid
    for(i=1;i<=m;i++)
    {
    Front = 1, Back = 0;
    for (j = 1; j <= n; j++)
    {
        // Cat timp elementul curent este mai mic decat ultimul element din deque, eliminam pozitia ultimului element din deque
        while (Front <= Back && a[i][j] <= a[i][ v[Back] ]) Back--;
        // Adaugam pozitia elementului curent in deque
        v[++Back] = j;

        // Daca elementul minim coincide cu cel de pe pozita i-K, ii eliminam pozitia din deque, deoarece acesta nu mai conteaza pentru pasii >= i
        if (v[Front] == j-y) Front++;

        // Afisam minimul, acesta aflandu-se in varful deque-ului
        if (j >= y) b[i][j-y+1]= a[i][v[Front]];
    }
    }
    for(j=1;j<=n-y+1;j++)
    {
    Front = 1, Back = 0;
    for (i = 1; i <= m; i++)
    {
        // Cat timp elementul curent este mai mic decat ultimul element din deque, eliminam pozitia ultimului element din deque
        while (Front <= Back && b[i][j] <= b[ v[Back] ][j]) Back--;
        // Adaugam pozitia elementului curent in deque
        v[++Back] = i;

        // Daca elementul minim coincide cu cel de pe pozita i-K, ii eliminam pozitia din deque, deoarece acesta nu mai conteaza pentru pasii >= i
        if (v[Front] == i-x) Front++;

        // Afisam minimul, acesta aflandu-se in varful deque-ului
        if (i >= x) minim[i-x+1][j]= b[v[Front]][j];
    }
    }
    //maxim
    Front = 1, Back = 0; // Initializare, Back < Front => deque-ul este vid
    for(i=1;i<=m;i++)
    {
    Front = 1, Back = 0;
    for (j = 1; j <= n; j++)
    {
        // Cat timp elementul curent este mai mic decat ultimul element din deque, eliminam pozitia ultimului element din deque
        while (Front <= Back && a[i][j] >= a[i][ v[Back] ]) Back--;
        // Adaugam pozitia elementului curent in deque
        v[++Back] = j;

        // Daca elementul minim coincide cu cel de pe pozita i-K, ii eliminam pozitia din deque, deoarece acesta nu mai conteaza pentru pasii >= i
        if (v[Front] == j-y) Front++;

        // Afisam minimul, acesta aflandu-se in varful deque-ului
        if (j >= y) b[i][j-y+1]= a[i][v[Front]];
    }
    }
    for(j=1;j<=n-y+1;j++)
    {
    Front = 1, Back = 0;
    for (i = 1; i <= m; i++)
    {
        // Cat timp elementul curent este mai mic decat ultimul element din deque, eliminam pozitia ultimului element din deque
        while (Front <= Back && b[i][j] >= b[ v[Back] ][j]) Back--;
        // Adaugam pozitia elementului curent in deque
        v[++Back] = i;

        // Daca elementul minim coincide cu cel de pe pozita i-K, ii eliminam pozitia din deque, deoarece acesta nu mai conteaza pentru pasii >= i
        if (v[Front] == i-x) Front++;

        // Afisam minimul, acesta aflandu-se in varful deque-ului
        if (i >= x) maxim[i-x+1][j]= b[v[Front]][j];
    }
    }
    for(i=1;i<=m-x+1;i++)
        for(j=1;j<=n-y+1;j++)
        {
            if(maxim[i][j]-minim[i][j]<sol)
                sol=maxim[i][j]-minim[i][j],k=1;
            else
            if(maxim[i][j]-minim[i][j]==sol)
                k++;
        }
}

int main()
{
    int p,i,j,l,x,y;
    fscanf(f,"%d%d%d",&m,&n,&p);
    for(i=1;i<=m;i++)
        for(j=1;j<=n;j++)
            fscanf(f,"%d",&a[i][j]);
    for(l=1;l<=p;l++)
    {
        fscanf(f,"%d%d",&x,&y);
        sol=10000;
        k=0;
        Deque(x,y);
        if(x!=y)
            Deque(y,x);
        g<<sol<<" "<<k<<'\n';
    }
    return 0;
}