Cod sursa(job #533877)
// http://infoarena.ro/problema/deque
#include <fstream>
//#include <vector>
#include <deque>
using namespace std;
#define maxSize 5000002
ifstream in("deque.in");
ofstream out("deque.out");
//vector<int> number;
int number[maxSize];
deque<int> myDeque;
int main() {
int numbers,lenght;
int tmp;
long long sum = 0;
in >> numbers >> lenght;
// evitam realocarea pe pe parcurs
//number.reserve(lenght+1);
// pentru a evita indexarea de la zero
//number.push_back(0);
for(int i=1;i<=numbers;++i) {
//in >> tmp;
in >> number[i];
//number.push_back(tmp);
}
for(int i=1;i<=numbers;++i) {
// cat timp elementul curent este mai mic decat ultimul element din deque
// eliminam pozitia ultimului element din acesta
while(!myDeque.empty() && myDeque.front() <= myDeque.back() && number[i] <= number[myDeque.back()])
myDeque.pop_back();
// adaugam pozitia elementului curent
myDeque.push_back(i);
// daca elementul minim coincide cu cel de pe pozitia i-k
// ii eliminam pozitia din deque, deoarece acesta
// nu mai conteaza pentru pasii >=i
if(myDeque.front() == i - lenght)
myDeque.pop_front();
// daca am trecut de pozitia "lenght" (avem o secventa)
if(i >= lenght)
// adaugam minimul la suma, acesta aflanduse pe prima pozitie
sum += number[myDeque.front()];
}
out << sum;
in.close();
out.close();
return (0);
}