Pagini recente » Cod sursa (job #2807649) | Cod sursa (job #2554679) | Cod sursa (job #3215252) | Cod sursa (job #1717510) | Cod sursa (job #2761997)
#include<fstream>
#include <iostream>
using namespace std;
ifstream f("deque.in");
ofstream g("deque.out");
int v[5000001];
int deque[5000001];
int main()
{
// folosesc coada cu 2 capete in care memorez pozitiile din vectorul
// v si pozitiile vor fi in ordine crescatoare pentru ca stergem mereu cand
// gasim o pozitie din v mai mica
int i;
long long n, k;
int primul, ultim;
long long suma = 0;
f >> n>> k;
for (i = 0; i < n; i++) {
f >> v[i];
}
primul = 0;
ultim = -1;
for (i = 0; i < n; i++) {
//la fiecare parcurgere valoarea v[i] eliminia de la finalul lui v
//toate elementele mai mari sau egale cu el
//deci, el devine noul minim pentru urmatoarele posbile secvente
//merge bine
while (primul <= ultim and v[i] <= v[deque[ultim]]) {
ultim--;
}
//il adaugam la finalul lui deque pozitia
ultim++;
deque[ultim] = i;
//sterg de la inceput lui deque dc minimul nu apartine subsecventei
if (deque[primul] + k == i)
primul++;
//Ruleaza bine aici
//daca avem minim o subsecventa de k elemente
//
//face bine
if (i + 1 >= k)
suma += v[deque[primul]];
}
g << suma;
f.close();
g.close();
return 0;
}