Pagini recente » Cod sursa (job #846868) | Cod sursa (job #586450) | Cod sursa (job #1594) | Cod sursa (job #2703371) | Cod sursa (job #2025026)
#include <fstream>
using namespace std;
ifstream cin("deque.in");
ofstream cout("deque.out");
long long NR[5000500];
struct node{
int nr;
int prev = -1;
int next = -1;
};
node N[5000500];
void afis(){
for (auto x : N){
cout<<NR[x.nr]<<" "/*<<x.nr<<" "*/<<" "<<x.prev<<" "<<x.next<<'\n';
}
}
class Deque{
int now = -1;
int pos_front = -1;
int pos_back = -1;
public:
bool empty(){
if (pos_front == -1){
return 1;
}
return 0;
};
void push_front(int val){
//cout<<"pos "<<pos_back<<" "<<pos_front<<'\n';
now++;
N[now].nr = val;
if (pos_front != -1){
N[now].prev = pos_front;
//cout<<"unesc "<<val<<" "<<N[pos_front].nr<<'\n';
N[pos_front].next = now;
//cout<<"unesc "<<N[pos_front].nr<<" "<<N[N.size() - 1].nr <<'\n';
}
pos_front = now;
if (pos_back == -1){
pos_back = now;
//cout<<"pula "<<back()<<'\n';
}
};
void push_back(int val){
//cout<<"pos "<<pos_back<<" "<<pos_front<<'\n';
now++;
N[now].nr = val;
if (pos_back != -1){
N[now].next = pos_back;
N[pos_back].prev = now;
}
pos_back = now;
if (pos_front == -1){
pos_front = now;
}
};
void pop_front(){
//cout<<"pos inceput "<<pos_back<<" "<<pos_front<<'\n';
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';
int old = pos_front;
pos_front = N[pos_front].prev;
N[old].prev = -1;
N[old].next = -1;
}
else{
//cout<<"front "<<front()<<'\n';
//cout<<"back "<<back()<<'\n';
pos_front = -1;
pos_back = -1;
}
//cout<<"pos final "<<pos_back<<" "<<pos_front<<'\n';
};
void pop_back(){
//cout<<"pos inceput "<<pos_back<<" "<<pos_front<<'\n';
if (pos_back == -1){
return;
}
if (N[pos_back].next != -1){
N[N[pos_back].next].prev = -1;
int old = pos_back;
pos_back = N[pos_back].next;
N[old].next = -1;
N[old].prev = -1;
}
else{
pos_back = -1;
pos_front = -1;
}
//cout<<"pos final "<<pos_back<<" "<<pos_front<<'\n';
};
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]){
//cout<<"scot "<<NR[i]<<" "<<NR[D.front()]<<'\n';
D.pop_front();
}
D.push_front(i);
//cout<<"front "<<NR[D.front()]<<'\n';
//cout<<"back "<<NR[D.back()]<<'\n';
//afis();
//cout<<"bag "<<i<<" "<<NR[D.front()]<<'\n';
}
//cout<<NR[D.back()]<<'\n';
cont += NR[D.back()];
for (int i=k+1; i<=n; i++){
while(!D.empty() && NR[D.front()] > NR[i]){
//cout<<"scot "<<NR[i]<<" "<<NR[D.front()]<<'\n';
D.pop_front();
}
D.push_front(i);
//cout<<"bag "<<i<<" "<<NR[D.front()]<<'\n';
if (D.back() <= i - k){
//cout<<"scot "<<NR[i]<<" "<<NR[D.back()]<<'\n';
D.pop_back();
}
//cout<<NR[D.back()]<<'\n';
cont += NR[D.back()];
//afis();
//cout<<"front "<<NR[D.front()]<<'\n';
//cout<<"back "<<NR[D.back()]<<'\n';
}
cout/*<<'\n'*/<<cont;
return 0;
}