Cod sursa(job #1992292)

Utilizator dragos231456Neghina Dragos dragos231456 Data 20 iunie 2017 02:20:10
Problema Struti Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.27 kb
#include <iostream>
#include <fstream>
#include <deque>
using namespace std;
ifstream f("struti.in");
ofstream g("struti.out");
int elem[1005][1005],n,m,p,a,b,ch;
int mn[1005][1005],mx[1005][1005],nr,rez;
deque<int> posmn,posmx;
string s;

int nextint()
{
    int nr=0;
    while(s[ch]>='0' && s[ch]<='9')
    {
        nr=nr*10+s[ch]-'0';
        ++ch;
    }
    ++ch;
    return nr;
}

int main()
{
    f>>n>>m>>p; getline(f,s);
    for(int i=1;i<=n;++i)
    {
        getline(f,s);
        ch=0;
        for(int j=1;j<=m;++j)
        {
            elem[i][j]=nextint();
        }
    }

    for(int z=1;z<=p;++z)
    {
        f>>a>>b;
        nr=0;
        rez=10000;
        for(int h=1;h<=2;++h)
        {
            ///minim si maxim de lungime b
            for(int i=1;i<=n;++i)
            {
                for(int j=1;j<=m;++j)
                {
                    //incadrare in limite
                    if(!posmn.empty() && j-posmn.front()>=b) posmn.pop_front();
                    if(!posmx.empty() && j-posmx.front()>=b) posmx.pop_front();

                    //element minim/maxim
                    while(!posmn.empty() && elem[i][j]<=elem[i][posmn.back()]) posmn.pop_back();
                    while(!posmx.empty() && elem[i][j]>=elem[i][posmx.back()]) posmx.pop_back();

                    //adaguare element
                    posmx.push_back(j);
                    posmn.push_back(j);

                    //adaugare in matrice

                        mn[i][j]=elem[i][posmn.front()];
                        mx[i][j]=elem[i][posmx.front()];

                }
                //golire
                while(!posmn.empty()) posmn.pop_back();
                while(!posmx.empty()) posmx.pop_back();
            }
            ///secventa de lungime a optima
            for(int j=b;j<=m;++j)
            {
                for(int i=1;i<=n;++i)
                {
                    //incadrare in limite
                    if(!posmn.empty() && i-posmn.front()>=a) posmn.pop_front();
                    if(!posmx.empty() && i-posmx.front()>=a) posmx.pop_front();

                    //element maxim/minin
                    while(!posmn.empty() && mn[i][j]<=mn[posmn.front()][j]) posmn.pop_back();
                    while(!posmx.empty() && mx[i][j]>=mx[posmx.front()][j]) posmx.pop_back();

                    //adaugare element
                    posmx.push_back(i);
                    posmn.push_back(i);

                    //rezultat minim
                    if(i>=a)
                    {
                        if(mx[posmx.front()][j]-mn[posmn.front()][j]<rez)
                        {
                            rez=mx[posmx.front()][j]-mn[posmn.front()][j];
                            nr=1;
                        }
                        else if(mx[posmx.front()][j]-mn[posmn.front()][j]==rez)
                        {
                            ++nr;
                        }
                    }
                }
                //golire
                while(!posmn.empty()) posmn.pop_back();
                while(!posmx.empty()) posmx.pop_back();
            }
        if(a!=b) swap(a,b);
        else h=2;
        }
        g<<rez<<' '<<nr<<'\n';
    }

    return 0;
}