Cod sursa(job #2628724)

Utilizator sireanu_vladSireanu Vlad sireanu_vlad Data 17 iunie 2020 11:13:22
Problema Deque Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 kb
#include <iostream>
#include <fstream>
#include <deque>

using namespace std;

ifstream in("deque.in");
ofstream out("deque.out");

void read(int* v, int n)
{
    for(int i = 0; i < n; i++)
    {
        in >> v[i];
    }
}

void update(int x, deque<int>& u)
{
    if(x < u.back())
    {
        do
        {
            u.pop_back();
            if(u.size() == 0)
            {
                break;
            }
        }
        while(x < u.back());
    }
}

int main()
{
    int n, k;
    long long s = 0;
    in >> n >> k;
    int v[n];
    read(v, n);
    if(k == 1)
    {
        for(int i = 0; i < n; i++)
        {
            s += v[i];
            //cout << v[i] << " ";
        }
        out << s;
        return 0;
    }

    deque<int> u;
    u.push_back(v[0]);

    for(int i = 1; i < n; i++)
    {
        if(i - k >= 0)
        {
            if(v[i-k] == u.front())
            {
                u.pop_front();
            }
        }
        if(i != n-1)
        {
            //cout << "f";
            if(v[i] < v[i+1])
            {
                if(u.size() > 0)
                {
                    update(v[i], u);
                }
                u.push_back(v[i]);
            }
            else if(u.size() > 0)
            {
                update(v[i], u);
                u.push_back(v[i]);
            }

        }
        else
        {
            //cout << "here " << v[i] << ", " << u.back() << " ";
            if(u.size() > 0)
            {
                update(v[i], u);
            }
            u.push_back(v[i]);
        }
        if(i - k >= -1)
        {
            //cout << u.front() << " ";
            s += u.front();
        }
    }

    out << s;

    return 0;
}