Cod sursa(job #1045335)

Utilizator jul123Iulia Duta jul123 Data 1 decembrie 2013 13:42:58
Problema Struti Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 6.18 kb
#include<iostream>
#include<cstdio>

using namespace std;

int str[1000][1000], b[1000][1000], dqmin[1000000], dqmax[1000000], c[1000][1000], maxim[1000][1000], minim[1000][1000];
int main()
{
    FILE *fin, *fout;
    fin=fopen("struti.in","r");
    fout=fopen("struti.out","w");

    int i, j, nrlinii, nrcoloane, nrquery, k, l, MIN=10000,  t, lg, x, y, primmin, primmax, ultimmin, ultimmax, nr, aux,lungime, latime ;
    fscanf(fin, "%d %d %d", &nrlinii, &nrcoloane, &nrquery);
    for(i=0; i<nrlinii; i++)
        for(j=0; j<nrcoloane; j++)
            {fscanf(fin, "%d", &str[i][j]);
            b[i][j]=0;
            }
    for(aux=0; aux<nrquery; aux++)
    {
        //d[i][j]- pt latime fixata minimul de pe randl i care incepe cu j;
        MIN=10000;
        fscanf(fin, "%d %d", &lungime, &latime);
        for(i=0; i<nrlinii; i++)
        {
            primmin=1;
            ultimmin=0;
            primmax=1;
            ultimmax=0;
            ultimmax++;
            ultimmin++;
            dqmin[ultimmin]=0;
            dqmax[ultimmax]=0;
            if(0>=latime-1)
            {b[i][0]=str[i][dqmin[primmin]];
            c[i][0]=str[i][dqmax[primmax]];}
            for(j=1; j<nrcoloane; j++)
            {
                while (str[i][j]<str[i][dqmin[ultimmin]] && primmin <= ultimmin)
                    ultimmin--;
                while(str[i][j]>str[i][dqmax[ultimmax]] && primmax <=ultimmax)
                    ultimmax--;
                ultimmin++;
                ultimmax++;
                dqmin[ultimmin]=j;
                dqmax[ultimmax]=j;
                if(dqmin[primmin]==j-latime)
                    primmin++;
                if(dqmax[primmax]==j-latime)
                    primmax++;
                if(j>=latime-1)
                    {b[i][j]=str[i][dqmin[primmin]];
                     c[i][j]=str[i][dqmax[primmax]];

                    }
            }


        }


       for(i=latime-1; i<nrcoloane; i++)
        {
            primmin=1;
            ultimmin=0;
            ultimmin++;
            primmax=1;
            ultimmax=0;
            ultimmax++;
            dqmin[ultimmin]=0;
            dqmax[ultimmax]=0;
            if(0>=lungime-1)
                {
                    minim[0][i]=b[dqmin[primmin]][i];
                    maxim[0][i]=c[dqmax[primmax]][i];

                }
            for(j=1; j<nrlinii; j++)
            {
                while(b[j][i]<b[dqmin[ultimmin]][i] && primmin<=ultimmin)
                    ultimmin--;
                while(c[j][i]>c[dqmax[ultimmax]][i] && primmax<=ultimmax)
                    ultimmax--;
                ultimmin++;
                ultimmax++;
                dqmin[ultimmin]=j;
                dqmax[ultimmax]=j;
                if(dqmin[primmin]==j-lungime)
                    primmin++;
                if(dqmax[primmax]==j-lungime)
                    primmax++;
                if(j>=lungime-1)
                {
                    minim[j][i]=b[dqmin[primmin]][i];
                    maxim[j][i]=c[dqmax[primmax]][i];

                }
            }
        }
        for(j=lungime-1; j<nrlinii; j++)
            for(i=latime-1; i<nrcoloane; i++)
                {if(maxim[j][i]-minim[j][i]<MIN)
                    {MIN=maxim[j][i]-minim[j][i]; nr=1;}//am calculat t lungimeXlatime
                else
                    if(maxim[j][i]-minim[j][i]==MIN)
                        nr++;

}
if(latime!=lungime)
{for(i=0; i<nrlinii; i++)
        {
            primmin=1;
            ultimmin=0;
            primmax=1;
            ultimmax=0;
            ultimmax++;
            ultimmin++;
            dqmin[ultimmin]=0;
            dqmax[ultimmax]=0;
            if(0>=lungime-1)
            {b[i][0]=str[i][dqmin[primmin]];
            c[i][0]=str[i][dqmax[primmax]];}
            for(j=1; j<nrcoloane; j++)
            {
                while (str[i][j]<str[i][dqmin[ultimmin]] && primmin <= ultimmin)
                    ultimmin--;
                while(str[i][j]>str[i][dqmax[ultimmax]] && primmax <=ultimmax)
                    ultimmax--;
                ultimmin++;
                ultimmax++;
                dqmin[ultimmin]=j;
                dqmax[ultimmax]=j;
                if(dqmin[primmin]==j-lungime)
                    primmin++;
                if(dqmax[primmax]==j-lungime)
                    primmax++;
                if(j>=lungime-1)
                    {b[i][j]=str[i][dqmin[primmin]];
                     c[i][j]=str[i][dqmax[primmax]];

                    }
            }


        }


       for(i=lungime-1; i<nrcoloane; i++)
        {
            primmin=1;
            ultimmin=0;
            ultimmin++;
            primmax=1;
            ultimmax=0;
            ultimmax++;
            dqmin[ultimmin]=0;
            dqmax[ultimmax]=0;
            if(0>=latime-1)
                {
                    minim[0][i]=b[dqmin[primmin]][i];
                    maxim[0][i]=c[dqmax[primmax]][i];

                }
            for(j=1; j<nrlinii; j++)
            {
                while(b[j][i]<b[dqmin[ultimmin]][i] && primmin<=ultimmin)
                    ultimmin--;
                while(c[j][i]>c[dqmax[ultimmax]][i] && primmax<=ultimmax)
                    ultimmax--;
                ultimmin++;
                ultimmax++;
                dqmin[ultimmin]=j;
                dqmax[ultimmax]=j;
                if(dqmin[primmin]==j-latime)
                    primmin++;
                if(dqmax[primmax]==j-latime)
                    primmax++;
                if(j>=lungime-1)
                {
                    minim[j][i]=b[dqmin[primmin]][i];
                    maxim[j][i]=c[dqmax[primmax]][i];

                }
            }
        }
        for(j=latime-1; j<nrlinii; j++)
            for(i=lungime-1; i<nrcoloane; i++)
                {if(maxim[j][i]-minim[j][i]<MIN)
                    {MIN=maxim[j][i]-minim[j][i]; nr=1;}//am calculat t lungimeXlatime
                else
                    if(maxim[j][i]-minim[j][i]==MIN)
                        nr++;
                }}
fprintf(fout, "%d %d\n", MIN, nr);
}
}