Pagini recente » Cod sursa (job #208960) | Cod sursa (job #1560363) | Cod sursa (job #1474212) | Cod sursa (job #784973) | Cod sursa (job #1124947)
#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;
Knoten *Position[NMAX];
void Addieren(int x, int pos)
{
if(x < Deque->Wert)
{
Position[pos] = new Knoten(x, NULL, Deque, pos);
Deque->Links = Position[pos];
Deque = Position[pos];
}
else
{
Knoten *p = Deque, *p2;
while(p)
{
p2 = p->Recht;
if(!p2 || p2->Wert >= x)
break;
p = p2;
}
Position[pos] = new Knoten(x, p, p->Recht, pos);
if(p->Recht)
p->Recht->Links = Position[pos];
else
DequeEnd = Position[pos];
p->Recht = Position[pos];
}
while(DequeEnd->Wert > x)
{
Position[DequeEnd->Pos] = NULL;
DequeEnd = DequeEnd->Links;
delete DequeEnd->Recht;
DequeEnd->Recht = NULL;
}
}
void Entfernen(int pos)
{
if(!Position[pos])
return;
if(Deque == Position[pos])
Deque = Deque->Recht;
else
{
Position[pos]->Links->Recht = Position[pos]->Recht;
if(Position[pos]->Recht)
Position[pos]->Recht->Links = Position[pos]->Links;
}
delete Position[pos];
Position[pos] = NULL;
}
int main()
{
freopen("deque.in","r",stdin);
freopen("deque.out","w",stdout);
int x;
scanf("%d%d%d",&N,&K,&x);
Deque = DequeEnd = new Knoten(x,NULL,NULL,1);
Position[1] = Deque;
for(int i=2;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;
}