Pagini recente » Borderou de evaluare (job #1514634) | Borderou de evaluare (job #2299621) | Borderou de evaluare (job #2510998) | Borderou de evaluare (job #1211106) | Cod sursa (job #2000240)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("deque.in");
ofstream out("deque.out");
const int NMax = 5e6 + 5;
struct elem {
int val,idx;
elem(int _val = 0,int _idx = 0) {
val = _val;
idx = _idx;
}
};
struct elemCoada {
elem e;
elemCoada *prv,*nxt;
elemCoada() {
e = elem();
prv = 0;
nxt = 0;
}
};
struct deq {
int sz;
elemCoada *st,*dr;
deq() {
sz = 0;
st = dr = 0;
}
void pushFront(elem e) {
++sz;
if (sz == 1) {
st = new elemCoada();
st -> e = e;
dr = st;
return;
}
elemCoada *n = new elemCoada();
n -> e = e;
n -> nxt = st;
st -> prv = n;
st = n;
}
elem fata() {
if (sz == 0) {
return -1;
}
return st -> e;
}
void popFront() {
if (sz == 0) {
return;
}
if (sz == 1) {
popSingle();
return;
}
--sz;
elemCoada *n = st -> nxt;
delete st;
st = n;
st -> prv = 0;
}
void pushBack(elem e) {
++sz;
if (sz == 1) {
st = new elemCoada();
st -> e = e;
dr = st;
return;
}
elemCoada *n = new elemCoada();
n -> e = e;
n -> prv = dr;
dr -> nxt = n;
dr = n;
}
elem spate() {
if (sz == 0) {
return -1;
}
return dr -> e;
}
void popBack() {
if (sz == 0) {
return;
}
if (sz == 1) {
popSingle();
return;
}
--sz;
elemCoada *n = dr -> prv;
delete dr;
dr = n;
dr -> nxt = 0;
}
void popSingle() {
sz = 0;
delete st;
st = 0;
dr = 0;
}
}Q;
int N,K;
int main()
{
in>>N>>K;
for (int i=1;i < K;++i) {
int val;
in>>val;
while (Q.sz && Q.spate().val >= val) {
Q.popBack();
}
Q.pushBack(elem(val,i));
}
int ans = 0;
for (int i=K;i <= N;++i) {
int val;
in>>val;
while (Q.sz && Q.spate().val >= val) {
Q.popBack();
}
Q.pushBack(elem(val,i));
if (Q.fata().idx <= i-K) {
Q.popFront();
}
ans += Q.fata().val;
}
out<<ans<<'\n';
in.close();
out.close();
return 0;
}