Pagini recente » Cod sursa (job #536693) | Cod sursa (job #2240066) | Cod sursa (job #2424818) | Cod sursa (job #2489320) | Cod sursa (job #3126679)
#include <fstream>
#include <deque>
using namespace std;
ifstream f("deque.in");
ofstream g("deque.out");
int main()
{
deque <pair<int, int>> deq;
int n, k, el, sum = 0;
f >> n >> k;
for(int i = 1; i <= n; i++)
{
f >> el;
//vrem sa elimine din finalul deque-ului el mai mari ca el
int j = deq.size() - 1;
while(!deq.empty() && deq.at(j).first > el && j >= 0)
{
deq.pop_back();
j--;
}
deq.push_back(make_pair(el,i));
//pt fiecare segment care incepe de la k pana la final trebuie sa gasim un minim si sa-l adunam la secventa
if(i >= k)
{
//dam pop la minimele care nu mai sunt in secventa
while(deq[0].second < i - k + 1 && !deq.empty())
deq.pop_front();
//il luam pe cel care ramane primul in deq
sum += deq[0].first;
}
}
g << sum;
return 0;
}