Pagini recente » Cod sursa (job #690995) | Cod sursa (job #170476) | Cod sursa (job #1631780) | Cod sursa (job #898730) | Cod sursa (job #2245271)
#include <cstdio>
#include <cstdlib>
using namespace std;
struct deq_el
{
int poz, el;
deq_el *next, *prev;
};
struct deq
{
deq_el *cap, *coada;
};
void clean_deq(deq &d, int min_poz)
{
deq_el *curr = d.cap;
while(d.cap->poz < min_poz && d.cap->next)
{
curr = d.cap;
d.cap = d.cap->next;
d.cap->prev = 0;
free(curr);
}
if (d.cap == d.coada)
d.coada = 0;
if (d.cap->poz < min_poz)
{
free(d.cap);
d.cap=0;
d.coada = 0;
}
}
void insert_deq(deq &d, int val, int poz)
{
deq_el *curr = d.coada;
while(d.coada != d.cap && curr && val <= curr->el)
{
curr = d.coada;
d.coada = d.coada->prev;
d.coada->next = 0;
free(curr);
}
if (d.cap == d.coada)
d.coada = 0;
if (val <= d.cap->el)
{
free(d.cap);
d.cap = 0;
}
if (d.coada == 0)
if (d.cap)
{
d.coada = (deq_el*)malloc(sizeof(deq_el));
d.cap->next = d.coada;
d.coada->prev = d.cap;
}
else
{
d.cap = (deq_el*)malloc(sizeof(deq_el));
d.cap->next = d.cap->prev = 0;
d.cap->el = val;
d.cap->poz = poz;
d.coada = 0;
return;
}
else
{
curr = (deq_el*)malloc(sizeof(deq_el));
d.coada->next = curr;
curr->prev = d.coada;
d.coada = curr;
}
d.coada->next = 0;
d.coada->el = val;
d.coada->poz = 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 = (deq_el*)malloc(sizeof(struct deq_el));
d.coada = 0;
scanf("%d", &d.cap->el);
d.cap->poz = 1;
d.cap->next = d.cap->prev = 0;
for(i=2; 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->el;
}
printf("%d\n", s);
fclose(stdin);
fclose(stdout);
return 0;
}