Pagini recente » Cod sursa (job #1629420) | Cod sursa (job #2593470) | Cod sursa (job #847574) | Cod sursa (job #2764934) | Cod sursa (job #1125013)
#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)
{
while(Deque && DequeEnd->Links && DequeEnd->Wert > x)
{
DequeEnd = DequeEnd->Links;
delete DequeEnd->Recht;
DequeEnd->Recht = NULL;
}
if(DequeEnd && DequeEnd->Wert > x)
{
delete DequeEnd;
DequeEnd = Deque = NULL;
}
Knoten *p;
if(!Deque)
Deque = DequeEnd = new Knoten(x,NULL,NULL,pos);
else
if(x < Deque->Wert)
{
p = new Knoten(x, NULL, Deque, pos);
Deque->Links = p;
Deque = p;
}
else
{
p = Deque;
Knoten *p2;
while(p)
{
p2 = p->Recht;
if(!p2 || p2->Wert >= x)
break;
p = p2;
}
p->Recht = new Knoten(x, p, p->Recht, pos);
if(p->Recht->Recht)
p->Recht->Recht->Links = p->Recht;
else
DequeEnd = p->Recht;
}
}
void Entfernen(int minPos)
{
while(Deque->Pos <= minPos)
{
Deque = Deque->Recht;
delete Deque->Links;
Deque->Links = NULL;
}
}
int main()
{
freopen("deque.in","r",stdin);
freopen("deque.out","w",stdout);
int x;
scanf("%d%d",&N,&K);
for(int i=1;i<=K;i++)
{
scanf("%d",&x);
Addieren(x,i);
}
Sol += Deque->Wert;
for(int i=K+1;i<=N;i++)
{
Entfernen(i-K);
scanf("%d",&x);
Addieren(x,i);
Sol += Deque->Wert;
}
printf("%lld\n",Sol);
return 0;
}