Pagini recente » Cod sursa (job #3038707) | Cod sursa (job #1077215) | Cod sursa (job #2156556) | Cod sursa (job #2812689) | Cod sursa (job #3126796)
#include <iostream>
#include <fstream>
using namespace std;
const int MAXN = 5000010;
int N, K;
int A[MAXN], deque[MAXN];
int front, back;
long long sum;
int main()
{
ifstream in("deque.in");
ofstream out("deque.out");
in >> N >> K;
// citesc sirul
for (int i = 1; i <= N; i++)
in >> A[i];
// Initializez deque-ul vid (back < front)
front = 1, back = 0;
for (int i = 1; i <= N; i++)
{
// cat timp elementul curent este mai mic decat ultimul element din deque, elimin pozitia ultimului element din deque
while (front <= back && A[i] <= A[deque[back]]) back--;
// adaug pozitia elementului curent in deque
deque[++back] = i;
// daca min == deque[i-K], ii elimin pozitia din deque, deoarece acesta nu mai conteaza pentru pasii >= i
if (deque[front] == i-K) front++;
// afisez minimul (varful deque-ului)
if (i >= K) sum += A[deque[front]];
}
out << sum << '\n';
return 0;
}