Cod sursa(job #2742119)

Utilizator LucaSeriSeritan Luca LucaSeri Data 20 aprilie 2021 11:40:40
Problema Deque Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include <bits/stdc++.h>

using namespace std;

int main() {
    // freopen("stdin", "r", stdin);
    freopen("deque.in", "r", stdin);
    freopen("deque.out", "w", stdout);

    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    
    int n, k;
    cin >> n >> k;

    vector< int > v(n + 1);

    for(int i = 1; i <= n; ++i) {
        cin >> v[i];
    }

    deque< pair< int, int > > dq; // valoarea, timpul la care il scot

    for (int i = 1; i < k; ++i) {
        while(dq.size() > 0 && dq.back().first > v[i]) {
            dq.pop_back();
        }

        dq.push_back({v[i], i});
    }

    long long ans = 0;

    for(int i = k; i <= n; ++i) {
        while(dq.size() > 0 && dq.back().first > v[i]) {
            dq.pop_back();
        }

        dq.push_back({v[i], i});

        // daca secventa mea se termina cu indicele i
        // cel mai din stanga element continut in secventa este i - k + 1

        if(dq.front().second < i - k + 1) dq.pop_front();

        ans += dq.front().first;
    }

    cout << ans << '\n';
    return 0;
}