Pagini recente » Cod sursa (job #1021626) | Cod sursa (job #991453) | Cod sursa (job #108670) | Cod sursa (job #1670729) | Cod sursa (job #2732029)
#include <iostream>
using namespace std;
const int nMax = 5000005;
int v[nMax], dq[nMax], front = 1, back, n, k;
long long sum;
int main() {
freopen("deque.in", "r", stdin);
freopen("deque.out", "w", stdout);
// Iau 60p fara astea :(
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> k;
for (int i = 0; i < n; i++) {
cin >> v[i];
// Deque-ul este de forma [x minim, y>x dar mai recent adaugat, z>y dar si mai recent adaugat, etc].
// Aici incerc sa scot cat mai multe elemente ce au devenit "inutile" odata cu citirea ultimului.
// Parcurg de la dreapta la stanga fiindca asta e ordinea descrescatoare.
while (front <= back and v[dq[back]] >= v[i]) back--;
// Adaug elementul pe ultima pozitie (cel mai recent)
dq[++back] = i;
// Daca s-au citit deja k numere, atunci adauga la suma
if (i >= k - 1) {
sum += v[dq[front]];
}
// Daca minimul a devenit atat de vechi incat va fi inutilizabil la urmatorul pas, atunci sterge-l
if (i - dq[front] + 1 >= k) front++;
}
cout << sum;
return 0;
}