Cod sursa(job #260203)

Utilizator RobybrasovRobert Hangu Robybrasov Data 16 februarie 2009 19:48:30
Problema Deque Scor 25
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
//deque implementat manual cu lista dublu inlantuita
#include <cstdio>
#define N 5000010

typedef struct noduri
{
	int val;
	noduri *urm,*prev;
} adr;

int n,k,i,A[N],sum;
adr *DQ,*li,*ls;

void push_back(int nr)
{
    adr *p=new adr;
    p->val=nr;
    p->urm=NULL;
    if (ls)
    {
        p->prev=ls;
        ls->urm=p;
        ls=p;
    }
    else
    {
        p->prev=NULL;
        ls=p;
        li=ls;
    }
}

void pop_back()
{
    adr *p;
    p=ls;
    ls=ls->prev;
    if (ls) ls->urm=NULL;
    delete p;
}

void pop_front()
{
    adr *p;
    p=li;
    li=li->urm;
    if (li) li->prev=NULL;
    delete p;
}

int main()
{
	freopen("deque.in","r",stdin);
	freopen("deque.out","w",stdout);
	scanf("%d%d\n",&n,&k);
    for (i=1; i<=n; i++) scanf("%d\n",&A[i]);
    sum=0;
    for (i=1; i<=n; i++)
    {
        while (ls && A[i]<=A[ls->val])
            pop_back();
        push_back(i);
        if (li->val<=i-k)
            pop_front();
        if (i>=k)
            sum+=A[li->val];
    }

    printf("%d",sum);

    return 0;
}