Pagini recente » Cod sursa (job #217055) | Cod sursa (job #2511587) | Cod sursa (job #1929742) | Cod sursa (job #3171616) | Cod sursa (job #2245296)
#include <cstdio>
#include <cstdlib>
using namespace std;
struct deq_el
{
int poz, val;
deq_el *next, *prev;
};
struct deq
{
deq_el *cap, *coada;
};
bool isempty(deq d)
{
return d.cap == 0;
}
void insert_front(deq &d, int val, int poz)
{
if(d.cap == 0)
{
d.cap = (deq_el*) malloc(sizeof(deq_el));
d.cap->prev = d.cap->next = 0;
d.cap->val = val;
d.cap->poz = poz;
return;
}
deq_el * cr = (deq_el*) malloc(sizeof(deq_el));
cr->prev = 0;
cr->next = d.cap;
cr->val = val;
cr->poz = poz;
d.cap->prev = cr;
d.cap = cr;
}
void insert_back(deq &d, int val, int poz)
{
if (!d.cap)
{
insert_front(d, val, poz);
return;
}
deq_el * cr = (deq_el*) malloc(sizeof(deq_el));
cr->next = 0;
cr->val = val;
cr->poz = poz;
if(d.coada)
{
d.coada->next = cr;
cr->prev = d.coada;
d.coada = cr;
}
else
{
d.coada = cr;
cr->prev = d.cap;
d.cap->next = cr;
}
}
void delete_front(deq &d)
{
if(!d.cap)
return;
if (d.cap->next)
{
deq_el *cr = d.cap;
d.cap = d.cap->next;
d.cap->prev = 0;
free(cr);
if(d.cap == d.coada)
{
d.coada = 0;
d.cap->next = d.cap->prev = 0;
}
return;
}
free(d.cap);
d.cap = 0;
}
void delete_back(deq &d)
{
if (!d.coada)
{
delete_front(d);
return;
}
if (d.coada->prev == d.cap)
{
d.cap->next = 0;
free(d.coada);
d.coada = 0;
return;
}
deq_el *cr;
cr = d.coada;
d.coada = d.coada->prev;
d.coada->next = 0;
free(cr);
}
void clean_deq(deq &d, int min_poz)
{
while(!isempty(d) && d.cap->poz < min_poz)
delete_front(d);
}
void insert_deq(deq &d, int val, int poz)
{
while(!isempty(d) && d.coada && val <= d.coada->val)
delete_back(d);
if (d.cap && val <= d.cap->val)
delete_front(d);
insert_back(d, val, poz);
}
int main()
{
freopen("deque.in", "r", stdin);
freopen("deque.out", "w", stdout);
int n, m, i, x, s = 0;
scanf("%d%d", &n, &m);
deq d;
d.cap = d.coada = 0;
for(i=1; i<m; ++i)
{
scanf("%d", &x);
insert_deq(d, x, i);
}
for(i=m; i<=n; ++i)
{
scanf("%d", &x);
clean_deq(d, i-m+1);
insert_deq(d, x, i);
s += d.cap->val;
}
printf("%d\n", s);
fclose(stdin);
fclose(stdout);
return 0;
}