Pagini recente » Cod sursa (job #1877541) | Cod sursa (job #1511901) | Cod sursa (job #391526) | Cod sursa (job #1243955) | Cod sursa (job #735922)
Cod sursa(job #735922)
#include <fstream>
#include <deque>
#define type long long
#define NM 5000010
using namespace std;
ifstream f("deque.in");
ofstream g("deque.out");
deque<type> D;
type n,k,i,x,V[NM],ANS=0;
void PushInDeque(int i) // Introduc numarul in Deque, in spate
{
while (!D.empty() && V[D.back()]>=V[i]) D.pop_back(); // Cat timp am numere in Deque, iar numarul din spate e mai mare decat numarul curent scot din capat
D.push_back(i);
return;
}
void PopDeque(int i)
{
while (!D.empty() && D.front()<=i-k) D.pop_front(); // Cat timp am numere in Deque, iar elementul din fata nu se afla in subsecventa de lungime k ce se termina pe pozitia i scot din fata
return;
}
int MinSub() {
if (!D.empty()) return V[D.front()]; // In fata voi avea minimul din subsecventa de lungime k ce se termina pe pozitia i
return 0;
}
int main()
{
f >> n >> k;
for (i=1;i<=n;i++) f >> V[i];
for (i=1;i<k;i++)
PushInDeque(i);
for (i=k;i<=n;i++)
{
PopDeque(i);
PushInDeque(i);
ANS+=MinSub();
}
g << ANS << '\n';
f.close();g.close();
return 0;
}