Pagini recente » Cod sursa (job #2914495) | Cod sursa (job #2063889) | Cod sursa (job #2632728) | Cod sursa (job #2211976) | Cod sursa (job #2024583)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("deque.in");
ofstream cout("deque.out");
long long NR[5000500];
struct node{
int nr;
int pos;
int prev = -1;
int next = -1;
};
vector <node> N;
class Deque{
int pos_front = -1;
int pos_back = -1;
public:
bool empty(){
if (pos_front == -1){
return 1;
}
return 0;
};
void push_front(int val){
node now;
N.push_back(now);
N[N.size() - 1].nr = val;
N[N.size() - 1].pos = N.size() - 1;
if (pos_front != -1){
N[N.size() - 1].prev = pos_front;
N[pos_front].next = N.size() - 1;
}
pos_front = N.size() - 1;
if (pos_back == -1){
pos_back = N.size() - 1;
}
};
void push_back(int val){
node now;
N.push_back(now);
N[N.size() - 1].nr = val;
N[N.size() - 1].pos = N.size() - 1;
if (pos_back != -1){
N[N.size() - 1].next = pos_back;
N[pos_back].prev = N.size() - 1;
}
pos_back = N.size() - 1;
if (pos_front == -1){
pos_front = N.size() - 1;
}
};
void pop_front(){
if (pos_front == -1){
return;
}
if (N[pos_front].prev != -1){
N[N[pos_front].prev].next = -1;
//cout<<N[N[pos_front].prev].pos<<'\n';
pos_front = N[N[pos_front].prev].pos;
N[pos_front].prev = -1;
}
else{
pos_front = -1;
pos_back = -1;
}
};
void pop_back(){
if (pos_back == -1){
return;
}
if (N[pos_back].next != -1){
N[N[pos_back].next].prev = -1;
pos_back = N[N[pos_back].next].pos;
N[pos_back].next = -1;
}
else{
pos_back = -1;
pos_front = -1;
}
};
int front(){
if (pos_front == -1){
return -1e9;
}
return N[pos_front].nr;
};
int back(){
if (pos_back == -1){
return -1e9;
}
return N[pos_back].nr;
};
} D;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
long long cont = 0;
int n, k;
cin>>n>>k;
for (int i=1; i<=n; i++){
cin>>NR[i];
}
for (int i=1; i<=k; i++){
while(!D.empty() && NR[D.front()] > NR[i]){
D.pop_front();
}
D.push_front(i);
}
cont += NR[D.back()];
for (int i=k+1; i<=n; i++){
while(!D.empty() && NR[D.front()] > NR[i]){
D.pop_front();
}
D.push_front(i);
if (D.back() <= i - k){
D.pop_back();
}
cont += NR[D.back()];
}
cout<<cont;
return 0;
}