Pagini recente » Cod sursa (job #3142098) | Cod sursa (job #2350676) | Cod sursa (job #1615723) | Cod sursa (job #2673157) | Cod sursa (job #1125105)
#include <cstdio>
using namespace std;
#define NMAX 5000010
int N,K;
long long Sol;
struct Knoten {
int Wert,Pos;
Knoten *Links, *Recht;
Knoten(int a, Knoten *b, Knoten *c, int d)
{
Wert = a;
Links = b;
Recht = c;
Pos = d;
}
};
Knoten *Deque,*DequeEnd;
void Addieren(int x, int pos)
{
if(DequeEnd)
while(DequeEnd && DequeEnd->Wert > x)
if(DequeEnd->Links)
{
DequeEnd = DequeEnd->Links;
delete DequeEnd->Recht;
}
else
{
delete DequeEnd;
DequeEnd = Deque = NULL;
}
if(!Deque)
Deque = DequeEnd = new Knoten(x,NULL,NULL,pos);
else
{
DequeEnd->Recht = new Knoten(x,DequeEnd,NULL,pos);
DequeEnd = DequeEnd->Recht;
}
}
void Entfernen(int minPos)
{
while(Deque && Deque->Recht && Deque->Pos <= minPos)
{
Deque = Deque->Recht;
delete Deque->Links;
Deque->Links = NULL;
}
if(Deque && Deque->Pos <= minPos)
{
delete Deque;
Deque = DequeEnd = NULL;
}
}
int main()
{
freopen("deque.in","r",stdin);
freopen("deque.out","w",stdout);
scanf("%d%d",&N,&K);
for(int i=1,x;i<=N;i++)
{
Entfernen(i-K);
scanf("%d",&x);
Addieren(x,i);
if(i>=K)
Sol += Deque->Wert;
}
printf("%lld\n",Sol);
return 0;
}