Pagini recente » Cod sursa (job #3212565) | Cod sursa (job #2725572)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("deque.in");
ofstream fout ("deque.out");
int v[5000010], d[5000010];
int main(){
/// Citire
int n, k;
fin >> n >> k;
for (int i = 1; i <= n ; i++){
fin >> v[i];
}
long long sol = 0;
/// Inseram in deque primul element
d[1] = 1;
int st = 1;
int dr = 1;
for (int i = 2; i <= n; i++){
/// Scoatem elementele mai mari decat v[i] deoarece nu vor mai fi utile
while (v[i] < v[d[dr]] && st <= dr){
/// pop_back()
dr--;
}
/// Adaugam in deque elementul curent
/// push_back(i)
dr++;
d[dr] = i;
/// Scoatem din fata elementul care a iesit din secventa
if(d[dr] - d[st] >= k){
/// pop_front()
st++;
}
/// Daca secventa are cel putin k numere adaugam minimul, care se afla in d[st]
if (i >= k){
sol += v[d[st]];
}
}
fout << sol;
}