Pagini recente » Cod sursa (job #1305415) | Cod sursa (job #1107111) | Cod sursa (job #672329) | Cod sursa (job #1266683) | Cod sursa (job #1193828)
#include <fstream>
#include <iostream>
using namespace std;
#define ERR -2000000001
#define MAX 5000001
struct nod{
int info;
nod *urm, *ant;
};
struct dequee{
int size;
nod *prim, *ult;
} deq;
void push_back(dequee &q, int x);
void push_front(dequee &q, int x);
void pop_front(dequee &q);
void pop_back(dequee &q);
bool empty(dequee q){return q.size==0;}
int front(dequee q);
int back(dequee q);
void afis(dequee q);
int n, k, v[MAX];
ifstream fin("deque.in");
ofstream fout("deque.out");
int main()
{
int i, x;
long long rez=0;
fin>>n>>k;
for(i=1; i<=n; i++)
fin>>v[i];
for(i=1; i<=n; i++){
while(!empty(deq) and v[i]<=v[back(deq)])
pop_back(deq);
if(!empty(deq) and i-k==front(deq))
pop_front(deq);
push_back(deq, i);
if(i>=k)
rez = rez + v[front(deq)];
}
fout<<rez;
return 0;
}
int front(dequee q){
if(q.size==0){
cout<<"GOL\n";
return ERR;
}
return q.prim->info;
}
int back(dequee q){
if(q.size==0){
cout<<"GOL\n";
return ERR;
}
return q.ult->info;
}
void pop_back(dequee &q){
if(q.size==0){
cout<<"GOL\n";
return;
}
if(q.size==1){
delete q.prim;
q.size = 0;
q.prim = q.ult = NULL;
return;
}
nod *desters = q.ult;
q.ult = q.ult->ant;
q.ult->urm = NULL;
q.size--;
delete desters;
return;
}
void pop_front(dequee &q){
if(q.size==0){
cout<<"GOL\n";
return;
}
if(q.size==1){
delete q.prim;
q.size = 0;
q.prim = q.ult = NULL;
return;
}
nod *desters = q.prim;
q.prim = q.prim->urm;
q.prim->ant = NULL;
q.size--;
delete desters;
return;
}
void push_front(dequee &q, int x){
nod *nou = new nod;
nou->info = x;
nou->urm = q.prim;
nou->ant = NULL;
if(q.size==0) //coada goala asa ca ultimul este si primul
q.ult = nou;
else
q.prim->ant = nou; //altfel adresa ultimului arata catre nou
q.prim = nou;
q.size++;
}
void push_back(dequee &q, int x){
nod *nou = new nod;
nou->info = x;
nou->urm = NULL;
nou->ant = q.ult;
if(q.size==0) //coada goala asa ca primul este si ultimul
q.prim = nou;
else
q.ult->urm = nou; //altfel adresa ultimului arata catre nou
q.ult = nou;
q.size++;
}
void afis(dequee q)
{
nod *p=q.prim;
while(p){
fout<<p->info<<' ';
p = p->urm;
}
}