Pagini recente » Cod sursa (job #1458236) | Cod sursa (job #1814710) | Cod sursa (job #1610523) | Cod sursa (job #326280) | Cod sursa (job #2761787)
#include <fstream>
#include <iostream>
using namespace std;
long A[5000010],deque[5000010],n,i,k,x;
long long sum=0;
int main()
{
long A[5000010],deque[5000010],n,i,k,x;
long long sum_min=0;
ifstream f("deque.in");
ofstream g("deque.out");
int fata=1,spate=0; //momentan deque este gol
f>>n>>k;
for(i=1;i<=n;i++)
f>>A[i];
for(i=1;i<=n;i++)
{
while(fata<=spate && A[i]<=A[deque[spate]]) // Cat timp elementul curent este mai mic decat ultimul element din deque
spate--; // eliminam pozitia ultimului element din deque
deque[++spate]=i; // Adaugam pozitia elementului curent in deque
if(deque[fata]==i-k) fata++; // Daca elementul minim este egal cu cel de pe pozita i-K
//ii eliminam pozitia din deque, deoarece acesta nu mai conteaza pentru pasii >= i
if(i>=k) sum_min=sum_min + A[deque[fata]]; // Afisam minimul, acesta aflandu-se in varful deque-ului
}
g<<sum;
f.close();
g.close();
return 0;
}