Cod sursa(job #2090979)

Utilizator AlexGAlexandru Gheorghe AlexG Data 18 decembrie 2017 22:07:45
Problema Secventa Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2 kb
#include <fstream>
#include <deque>
#include <cstdio>
#include <cctype>

using namespace std;

struct Numar
{
    int valoare;
    int pozitie;
};

char buffer[4096];
char citesteCaracter(int *pozitieCurenta)
{
    (*pozitieCurenta)++;
    if(*pozitieCurenta == 4096)
    {
        *pozitieCurenta = 0;
        fread(buffer, 1, 4096, stdin);
    }
    return buffer[*pozitieCurenta];
}

int citesteIntreg(int *pozitieCurenta)
{
    int intreg = 0;
    char c = citesteCaracter(pozitieCurenta);
    while (!isdigit(c) && c != '-')
        c = citesteCaracter(pozitieCurenta);
    int semn = 1;
    if (c == '-')
        semn = -1;
    else
        intreg = c - '0';
    c = citesteCaracter(pozitieCurenta);
    while (isdigit(c))
    {
        intreg *= 10;
        intreg += c-'0';
        c = citesteCaracter(pozitieCurenta);
    }
    return intreg * semn;
}

int main()
{
    int numarNumere, lungimeSecventa;
    freopen("secventa.in", "r", stdin);
    int pozitieCurenta = 4095;
    numarNumere = citesteIntreg(&pozitieCurenta);
    lungimeSecventa = citesteIntreg(&pozitieCurenta);
    int inceputSecventa=0, sfarsitSecventa=0, bazaMaxima=-30001;
    deque<Numar> dequeCrescator;
    for(int i=1; i<=numarNumere; ++i)
    {
        Numar numar;
        numar.valoare = citesteIntreg(&pozitieCurenta);
        numar.pozitie = i;
        while(!dequeCrescator.empty() && numar.valoare <= dequeCrescator.front().valoare)
            dequeCrescator.pop_front();
        dequeCrescator.push_front(numar);
        if(dequeCrescator.back().pozitie == i-lungimeSecventa)
            dequeCrescator.pop_back();
        if(i>=lungimeSecventa && dequeCrescator.back().valoare>bazaMaxima)
        {
            bazaMaxima = dequeCrescator.back().valoare;
            inceputSecventa = i-lungimeSecventa+1;
            sfarsitSecventa = i;
        }
    }
    ofstream fout("secventa.out");
    fout << inceputSecventa << ' ' << sfarsitSecventa << ' ' << bazaMaxima;
    return 0;
}