Pagini recente » Rating Antonia Comsa (AntoniaComsa) | Cod sursa (job #236741) | Cod sursa (job #1000851) | Cod sursa (job #2549730) | Cod sursa (job #2623816)
#include <iostream>
#include <fstream>
#include <algorithm>
#include<bits/stdc++.h>
using namespace std;
ifstream in("deque.in");
ofstream out("deque.out");
int n,i,j,k,nr,v[5000001],coada_dubla[5000001],inceput,final;
long long suma=0;
int main()
{
in>>n>>k;
for(i=1; i<=n; i++)
in>>v[i];
inceput=1;
final=0;//coada este vida
for(i=1; i<=n; i++)
{
while(inceput<=final and v[i]<=v[coada_dubla[final]])//cat timp elemnetul curent e mai mic decat ultimul el din coada scadem indicele de final,eliminand elementul
final--;
final++;//crestem indicele de final pt a aduaga elementul curent(care este cel minim)
coada_dubla[final]=i;//il adaugam
if(coada_dubla[inceput]==i-k)//daca minimul este elementul de pe pozitia i-k,crestem indicele de la inceput,eliminandu-l pt ca vrem sa cautam minimul printre urmatoarele pozitii mai mari de i
inceput++;
if(i>=k)//dupa ce am parcurs cel putin k pozitii adaugam minimul(elementul de la inceputul cozii) la suma
suma+=v[coada_dubla[inceput]];
}
out<<suma;
}