Pagini recente » Cod sursa (job #959132) | Cod sursa (job #3177437) | Cod sursa (job #2130612) | Cod sursa (job #1342128) | Cod sursa (job #1583382)
#include <iostream>
#include <fstream>
using namespace std;
ifstream F("deque.in");
ofstream G("deque.out");
const int N = 5000010;
template <class T>
class deque {
private:
struct node {
T value;
node *next;
node *last;
};
node *front;
node *back;
public:
deque() {
front = back = nullptr;
}
void push_front(T value) {
node *newNode = new node();
newNode -> next = front;
newNode -> value = value;
front = newNode;
if ( back == nullptr ) back = front;
}
void push_back(T value) {
node *newNode = new node();
newNode -> last = back;
newNode -> value = value;
back = newNode;
if ( front == nullptr ) front = back;
}
T get_front() {
return front -> value;
}
T get_back() {
return back -> value;
}
void pop_front() {
node *now = front;
front = front -> next;
delete now;
}
void pop_back() {
node *now = back;
back = back -> last;
delete now;
}
};
int n,k,a[N];
deque<int> dq;
long long ans;
int main()
{
F>>n>>k;
for (int i=1;i<=n;++i)
F>>a[i];
for (int i=1;i<=k;++i)
{
if ( !dq.empty() )
{
while ( a[i] < a[dq.back()] )
{
dq.pop_back();
if ( dq.empty() ) break;
}
}
dq.push_back( i );
}
ans += a[dq.front()];
for (int i=k+1;i<=n;++i)
{
if ( !dq.empty() )
if ( dq.front() <= i-k )
dq.pop_front();
if ( !dq.empty() )
{
while ( a[i] < a[dq.back()] )
{
dq.pop_back();
if ( dq.empty() ) break;
}
}
dq.push_back( i );
ans += a[dq.front()];
}
G<<ans<<'\n';
}