Cod sursa(job #2135897)

Utilizator rares1012Rares Cautis rares1012 Data 19 februarie 2018 14:08:51
Problema Struti Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 7 kb
#include <stdio.h>
#include <stdlib.h>

int v[1000][1000];

int dmax[1000][1000];
int dmin[1000][1000];

int deque1[1000][2];
int deque2[1000][2];

int main()
{
    int n,m,p,i,j,k,l,c,fin1,st1,fin2,st2,q,min,nrmin;
    FILE*fi,*fo;
    fi=fopen("struti.in","r");
    fo=fopen("struti.out","w");
    fscanf(fi,"%d%d%d",&n,&m,&p);
    for(i=0; i<n; i++)
        for(j=0; j<m; j++)
            fscanf(fi,"%d",&v[i][j]);
    for(k=0; k<p; k++)
    {
        fscanf(fi,"%d%d",&l,&c);
        min=10000;
        for(i=0; i<n; i++)
        {
            fin1=0;
            st1=0;
            q=0;
            while(q<c)
            {
                while(fin1>st1 && v[i][q]<deque1[fin1-1][0])
                    fin1--;
                deque1[fin1][0]=v[i][q];
                deque1[fin1][1]=q;
                fin1++;
                q++;
            }
            dmin[i][0]=deque1[st1][0];
            while(q<m)
            {
                if(q-deque1[st1][1]>=c)
                    st1++;
                while(fin1>st1 && v[i][q]<deque1[fin1-1][0])
                    fin1--;
                deque1[fin1][0]=v[i][q];
                deque1[fin1][1]=q;
                dmin[i][q-c+1]=deque1[st1][0];
                fin1++;
                q++;
            }
        }
        for(i=0; i<n; i++)
        {
            fin1=0;
            st1=0;
            q=0;
            while(q<c)
            {
                while(fin1>st1 && v[i][q]>deque1[fin1-1][0])
                    fin1--;
                deque1[fin1][0]=v[i][q];
                deque1[fin1][1]=q;
                fin1++;
                q++;
            }
            dmax[i][0]=deque1[st1][0];
            while(q<m)
            {
                if(q-deque1[st1][1]>=c)
                    st1++;
                while(fin1>st1 && v[i][q]>deque1[fin1-1][0])
                    fin1--;
                deque1[fin1][0]=v[i][q];
                deque1[fin1][1]=q;
                dmax[i][q-c+1]=deque1[st1][0];
                fin1++;
                q++;
            }
        }
        for(i=0; i<=m-c; i++)
        {
            fin1=0;
            st1=0;
            fin2=0;
            st2=0;
            q=0;
            while(q<l)
            {
                while(fin1>st1 && dmin[q][i]<deque1[fin1-1][0])
                    fin1--;
                deque1[fin1][0]=dmin[q][i];
                deque1[fin1][1]=q;
                fin1++;
                while(fin2>st2 && dmax[q][i]>deque2[fin2-1][0])
                    fin2--;
                deque2[fin2][0]=dmax[q][i];
                deque2[fin2][1]=q;
                fin2++;
                q++;
            }
            if(deque2[st2][0]-deque1[st1][0]<min)
            {
                min=deque2[st2][0]-deque1[st1][0];
                nrmin=1;
            }
            else if(deque2[st2][0]-deque1[st1][0]==min)
                nrmin++;
            while(q<n)
            {
                if(q-deque1[st1][1]>=l)
                    st1++;
                if(q-deque2[st2][1]>=l)
                    st2++;
                while(fin1>st1 && dmin[q][i]<deque1[fin1-1][0])
                    fin1--;
                deque1[fin1][0]=dmin[q][i];
                deque1[fin1][1]=q;
                fin1++;
                while(fin2>st2 && dmax[q][i]>deque2[fin2-1][0])
                    fin2--;
                deque2[fin2][0]=dmax[q][i];
                deque2[fin2][1]=q;
                fin2++;
                if(deque2[st2][0]-deque1[st1][0]<min)
                {
                    min=deque2[st2][0]-deque1[st1][0];
                    nrmin=1;
                }
                else if(deque2[st2][0]-deque1[st1][0]==min)
                    nrmin++;
                q++;
            }
        }
        if(l!=c){
        l+=c;
        c=l-c;
        l=l-c;
        for(i=0; i<n; i++)
        {
            fin1=0;
            st1=0;
            q=0;
            while(q<c)
            {
                while(fin1>st1 && v[i][q]<deque1[fin1-1][0])
                    fin1--;
                deque1[fin1][0]=v[i][q];
                deque1[fin1][1]=q;
                fin1++;
                q++;
            }
            dmin[i][0]=deque1[st1][0];
            while(q<m)
            {
                if(q-deque1[st1][1]>=c)
                    st1++;
                while(fin1>st1 && v[i][q]<deque1[fin1-1][0])
                    fin1--;
                deque1[fin1][0]=v[i][q];
                deque1[fin1][1]=q;
                dmin[i][q-c+1]=deque1[st1][0];
                fin1++;
                q++;
            }
        }
        for(i=0; i<n; i++)
        {
            fin1=0;
            st1=0;
            q=0;
            while(q<c)
            {
                while(fin1>st1 && v[i][q]>deque1[fin1-1][0])
                    fin1--;
                deque1[fin1][0]=v[i][q];
                deque1[fin1][1]=q;
                fin1++;
                q++;
            }
            dmax[i][0]=deque1[st1][0];
            while(q<m)
            {
                if(q-deque1[st1][1]>=c)
                    st1++;
                while(fin1>st1 && v[i][q]>deque1[fin1-1][0])
                    fin1--;
                deque1[fin1][0]=v[i][q];
                deque1[fin1][1]=q;
                dmax[i][q-c+1]=deque1[st1][0];
                fin1++;
                q++;
            }
        }
        for(i=0; i<=m-c; i++)
        {
            fin1=0;
            st1=0;
            fin2=0;
            st2=0;
            q=0;
            while(q<l)
            {
                while(fin1>st1 && dmin[q][i]<deque1[fin1-1][0])
                    fin1--;
                deque1[fin1][0]=dmin[q][i];
                deque1[fin1][1]=q;
                fin1++;
                while(fin2>st2 && dmax[q][i]>deque2[fin2-1][0])
                    fin2--;
                deque2[fin2][0]=dmax[q][i];
                deque2[fin2][1]=q;
                fin2++;
                q++;
            }
            if(deque2[st2][0]-deque1[st1][0]<min)
            {
                min=deque2[st2][0]-deque1[st1][0];
                nrmin=1;
            }
            else if(deque2[st2][0]-deque1[st1][0]==min)
                nrmin++;
            while(q<n)
            {
                if(q-deque1[st1][1]>=l)
                    st1++;
                if(q-deque2[st2][1]>=l)
                    st2++;
                while(fin1>st1 && dmin[q][i]<deque1[fin1-1][0])
                    fin1--;
                deque1[fin1][0]=dmin[q][i];
                deque1[fin1][1]=q;
                fin1++;
                while(fin2>st2 && dmax[q][i]>deque2[fin2-1][0])
                    fin2--;
                deque2[fin2][0]=dmax[q][i];
                deque2[fin2][1]=q;
                fin2++;
                if(deque2[st2][0]-deque1[st1][0]<min)
                {
                    min=deque2[st2][0]-deque1[st1][0];
                    nrmin=1;
                }
                else if(deque2[st2][0]-deque1[st1][0]==min)
                    nrmin++;
                q++;
            }
        }}
        fprintf(fo,"%d %d\n",min,nrmin);
    }
    fclose(fi);
    fclose(fo);
    return 0;
}