Cod sursa(job #2245271)

Utilizator akumariaPatrascanu Andra-Maria akumaria Data 24 septembrie 2018 22:12:45
Problema Deque Scor 15
Compilator cpp Status done
Runda Arhiva educationala Marime 2.25 kb
#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;
}