Pagini recente » Cod sursa (job #2680925) | Cod sursa (job #2887201) | Cod sursa (job #1004352) | Cod sursa (job #2038691) | Cod sursa (job #2624144)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("deque.in");
ofstream g("deque.out");
const int NMAX = 5000001;
int Deque[NMAX], A[NMAX];
int N, K;
int main()
{
int Front = 1, Back = 0; ///Initializam Back < Front => deque-ul este vid
long long S = 0;
f >> N >> K;
for(int i = 1; i <= N; i++)
f >> A[i];
for(int i = 1; i <= N; i++)
{
while (Front <= Back && A[i] <= A[Deque[Back]]) ///Eliminam pozitia ultimului element din deque cat timp elementul curent < ultimul element din deque
Back--;
Deque[++Back] = i; /// Adaugam pozitia elementului curent in deque
if (Deque[Front] == i - K) ///Daca elementul minim coincide cu cel de pe pozita i-K, ii eliminam pozitia din deque
Front++;
if (i >= K) ///Minimul se aflandu in varful deque-ului
S += A[Deque[Front]];
}
g << S;
return 0;
}