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