Pagini recente » Cod sursa (job #2088920) | Cod sursa (job #2774085) | Cod sursa (job #2809435) | Cod sursa (job #1375165) | Cod sursa (job #2887451)
#include <fstream>
using namespace std;
#define MAXN 5000020
int A[MAXN],deque[MAXN], i, k, n ;
long long sum=0 ;
int main()
{
int front = 1;
int back = 0;
// initializam dequeul vid
ifstream fin("deque.in");
ofstream fout("deque.out");
fin >> n >> k;
// citim din fisierul de intrare si actualizam vectorul A
for (i=1;i<=n;i++)
fin >> A[i];
for (i=1;i<=n;i++)
{
while(front<=back && A[i]<=A[deque[back]]) // daca avem elemente in deque, si elementul actual este mai mic decat ultimul element
back--; // din deque, ii eliminam indicele
deque[++back] = i; // asezam nr actual in fata ultimului nr din deque care este mai mic ca el
if(deque[front] == i-k) // in cazul in care pe prima pozitie avem un indice care nu mai este in range-ul actual
front++;
if (i>=k)
sum = sum + A[deque[front]] ; // daca am ajuns la prima secventa posibila, adaugam primul element din deque
// care va fi mereu cel mai mic element, conform while-ului de mai sus
}
fout << sum;
fin.close();
fout.close();
return 0;
}