Pagini recente » Cod sursa (job #2710754) | Cod sursa (job #1508177) | Cod sursa (job #513677) | Cod sursa (job #1705322) | Cod sursa (job #659130)
Cod sursa(job #659130)
/*
v[i] = al i-lea element citit
q = pastreaza elementele din vector in ordine crescatoare
poz[i] = pozitia elementului q[i] in raport cu vectorul v
*/
#include<cstdio>
#include<deque>
using namespace std;
long long n, k, sum;
deque <long long> q, poz;
int main() {
long long i, x, top = 0;
freopen("deque.in", "r", stdin), freopen("deque.out", "w", stdout);
// Citire date
scanf("%lld %lld", &n, &k);
sum = 0;
for(i = 0; i < n; i++) {
scanf("%lld", &x);
// Extragem ultimul element din coada cat timp acesta
// este mai mare sau egal cu elementul curet
while(q.size() > 0 && q.back() >= x) {
q.pop_back();
poz.pop_back();
}
// Adaugam elementul in coada
q.push_back(x);
poz.push_back(i);
top++;
// daca avem elementele unei secvente parcurse
if(top == k) {
sum += q.front();
// daca primiul element din coada (minimul) nu mai apartine
// secventei atunci il scoatem din coada
if(poz.front() <= i - k + 1) {
q.pop_front();
poz.pop_front();
}
top--;
}
}
printf("%lld\n", sum);
return 0;
}