Pagini recente » Cod sursa (job #1789597) | Cod sursa (job #2213716) | Cod sursa (job #354065) | Cod sursa (job #2360790) | Cod sursa (job #2649823)
#include <iostream>
#include <fstream>
using namespace std;
const int MAXN=5000001l;
ifstream f("deque.in");
ofstream g("deque.out");
int A[MAXN],N,K;///datele de intrare
long long sMin=0;
/**
Vector folosit ca deque(dequeue)=
coada cu dublu acces(la ambele capete)
contine pozitii ale elementelor din sir
*/
int D[MAXN],
p=1,u=0;///init deque p<u ==> deque-ul este vid
void calcul()
{
for(int i=1; i<=N; i++)
{
/**
Cat timp elementul curent este mai mic decat ultimul element
din deque se elimina poz ultimului element din deque
*/
while(p<=u && A[i] <= A[D[u]]) u--;
///Se adauga pozitia elemntului curent in deque
D[++u]=i;
/**
Daca elementul minim coincide cu cel de pe pozitia i-K,
aceasta pozitie se elimina din deque,
deoarece nu mai conteaza pentru pasii >=i
*/
if(D[p]==i-K)p++;
///Preluam minimul din varful deque-ului
if(i>=K) sMin +=A[D[p]];
}
}
int main()
{
f >> N >> K;
for(int i=1; i<=N; i++)
f>>A[i];
calcul();
g<<sMin;
f.close();
g.close();
return 0;
}