Pagini recente » Cod sursa (job #1739093) | Cod sursa (job #1857769) | Cod sursa (job #1459097) | Cod sursa (job #536316) | Cod sursa (job #3324513)
#include <algorithm>
#include <fstream>
#include <cassert>
const int MAXNK = 5e6, QSIZE = (1 << 23), MAXVAL = 1e7;
class Deque {
private:
int arr[QSIZE];
int qs = 0, qe = 0;
public:
const int ERR = MAXVAL + 1;
Deque() {
// QSIZE trebuie sa fie o putere de 2 ca sa mearga operatiile bitwise
assert(!(QSIZE & (QSIZE - 1)));
}
bool empty() {
return qs == qe;
}
int front() {
if (empty()) {
return ERR;
}
return arr[qs];
}
int back() {
if (empty()) {
return ERR;
}
return arr[(qe - 1 + QSIZE) & (QSIZE - 1)];
}
void push_front(int val) {
arr[qs = ((qs - 1 + QSIZE) & (QSIZE - 1))] = val;
}
void push_back(int val) {
arr[qe] = val;
qe = (qe + 1) & (QSIZE - 1);
}
void pop_front() {
qs = (qs + 1) & (QSIZE - 1);
}
void pop_back() {
qe = (qe - 1 + QSIZE) & (QSIZE - 1);
}
} deque;
std::ifstream fin;
std::ofstream fout;
int n, k;
int nums[MAXNK];
void read_input() {
fin.open("deque.in");
fin >> n >> k;
for (int i = 0; i < n; ++i) {
fin >> nums[i];
}
fin.close();
}
long long int calc_sum() {
long long int min_sum = 0;
int i;
// tin doar indicii din vector in coada
for (i = 0; i < k; ++i) {
while (!deque.empty() && nums[deque.back()] >= nums[i]) {
deque.pop_back();
}
deque.push_back(i);
}
min_sum = nums[deque.front()];
for (i = 1; i + k - 1 < n; ++i) {
if (deque.front() == i - 1) { // minimul e numarul care iese din secventa
deque.pop_front();
}
while (!deque.empty() && nums[deque.back()] >= nums[i + k - 1]) {
deque.pop_back();
}
deque.push_back(i + k - 1);
min_sum += nums[deque.front()];
}
return min_sum;
}
int main() {
read_input();
fout.open("deque.out");
fout << calc_sum() << '\n';
fout.close();
return 0;
}