Cod sursa(job #2245250)

Utilizator akumariaPatrascanu Andra-Maria akumaria Data 24 septembrie 2018 21:34:55
Problema Deque Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.03 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 insert_deq(deq &d, int val, int poz, int min_poz)
{
    deq_el *curr;
    if(d.cap->poz < min_poz)
        if (!d.coada)
        {
            d.cap->el = val;
            d.cap->poz = poz;
            return;
        }
        else
        {
            curr = d.cap;
            d.cap = d.cap->next;
            d.cap->prev = 0;
            free(curr);
        }

    curr = d.coada;
    while(d.coada && d.coada != d.cap && 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 (d.coada == 0)
        if (d.cap->el >= val)
        {
            d.cap->next = d.cap->prev = 0;

            d.cap->el = val;
            d.cap->poz = poz;
            return;
        }
        else
        {
            d.coada = (deq_el*)malloc(sizeof(deq_el));
            d.cap->next = d.coada;
            d.coada->prev = d.cap;
        }
    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=1; i<m-1; ++i)
    {
        scanf("%d", &x);
        insert_deq(d, x, i, i);
    }
    for(i=m; i<=n; ++i)
    {
        scanf("%d", &x);
        insert_deq(d, x, i, i-m+1);

        s += d.cap->el;
    }

    printf("%d\n", s);

    fclose(stdin);
    fclose(stdout);
    return 0;
}