Pagini recente » Cod sursa (job #1202555) | Cod sursa (job #1867558) | Cod sursa (job #2553128) | Cod sursa (job #499284) | Cod sursa (job #2724878)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("deque.in");
ofstream fout("deque.out");
//global pentru ca sunt array uri mari
int n,k,v[5000001];
int deque[5000001];
int front,back;
void Read()
{
fin>>n>>k;
for(int i=0;i<n;i++)
fin>>v[i];
fin.close();
}
void Do()
{
long long sum=0;
//pastrez in deque pozitiile si nu valorile
// pentru a putea tine cont cand se misca "pointerul" peste secventa
int current;
//initializare
front=0,back=-1;
for(int i=0;i<n;i++)
{
current=v[i];
while(front<=back && current<=v[deque[back]])
back--; //elimin elementele mai mari (sau egale!) decat cel curent
//pentru a pastra in deque minimele
//adaug curentul in deque
deque[++back]=i;
if(deque[front]==i-k) //minimul curent nu mai face parte din noua secventa (i,i-1,...,i-(k-1))
front++;
if(i>=k-1)
sum+=v[deque[front]]; //adaug minimul la suma
}
fout<<sum;
}
int main()
{
Read();
Do();
return 0;
}