Cod sursa(job #2245198)

Utilizator akumariaPatrascanu Andra-Maria akumaria Data 24 septembrie 2018 20:38:33
Problema Deque Scor 15
Compilator cpp Status done
Runda Arhiva educationala Marime 2.01 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)
{
    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;
}