Pagini recente » Cod sursa (job #538053) | Cod sursa (job #2100) | Cod sursa (job #1540728) | Cod sursa (job #2877970) | Cod sursa (job #658645)
Cod sursa(job #658645)
/*
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<vector>
#include<deque>
using namespace std;
long long n, k, sum;
vector <long long> v;
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);
for(i = 0; i < n; i++) scanf("%lld", &x), v.push_back(x);
sum = 0;
for(i = 0; i < v.size(); i++) {
// Extragem ultimul element din coada cat timp acesta
// este mai mare sau egal cu elementul curet
while(q.size() > 0 && q.back() >= v[i]) {
q.pop_back();
poz.pop_back();
}
// Adaugam elementul in coada
q.push_back(v[i]);
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;
}