Pagini recente » Cod sursa (job #113296) | Cod sursa (job #1619404) | Borderou de evaluare (job #810147) | Cod sursa (job #2643978) | Cod sursa (job #2293001)
#include <fstream>
#define Nmax 5000010
using namespace std;
ifstream f("deque.in");
ofstream g("deque.out");
int n, k, A[Nmax], Deque[Nmax];
long long Sum;
int main()
{ f>>n>>k;
for(int i=1;i<=n;++i) f>>A[i];
int Front=1,Back=0; /// Initializare, Back < Front => deque-ul este vid
for(int i=1;i<=n;++i)
{ /// Cat timp elementul curent este mai mic decat ultimul element din deque, eliminam pozitia ultimului element din deque
while(Front<=Back && A[i]<=A[Deque[Back]]) Back--;
Deque[++Back]=i; /// Adaugam pozitia elementului curent in deque
/// Daca elementul minim aflat in varful deque-ului coincide cu cel de pe pozita i-K, ii eliminam pozitia din deque, deoarece acesta nu mai conteaza pentru pasii >= i
if (Deque[Front]==i-k) Front++;
if (i>=k) Sum+=A[Deque[Front]]; /// insumam minimul, care se afla in varful deque-ului
}
g<<Sum<<'\n'; g.close(); return 0;
}