Pagini recente » Istoria paginii problema/nambartiori | Profil Andrei-27 | Profil Andrulian | Monitorul de evaluare | Cod sursa (job #1051330)
#include <cstdio>
#include <deque>
#define N 5000000
using namespace std;
struct elem
{
int val;
int ord;
};
elem heap[N];
int n;
void swap(elem &a,elem &b)
{
elem t;
t=a;
a=b;
b=t;
}
void urca(int pos)
{
while(pos>1 && heap[pos].val<heap[pos/2].val)
{
swap(heap[pos],heap[pos/2]);
pos/=2;
}
}
void coboara(int pos)
{
while( pos*2+1<=n && ( heap[pos].val>heap[pos*2].val || heap[pos].val>heap[pos*2+1].val ) )
{
int p=pos*2;
if(heap[p+1].val<heap[p].val)
++p;
swap(heap[pos],heap[p]);
pos=p;
}
if(pos*2==n && heap[pos].val>heap[pos*2].val)
swap(heap[pos],heap[pos*2]);
}
void adaug(int v,int o)
{
elem e;
e.val = v;
e.ord = o;
heap[++n]=e;
urca(n);
}
void elimin(int pos)
{
heap[pos]=heap[n--];
//urca(pos);
coboara(pos);
}
int main()
{
freopen("deque.in","r",stdin);
freopen("deque.out","w",stdout);
int m,k;
scanf("%d %d",&m,&k);
long long int s=0;
for(int i=0;i<m;++i)
{
int x;
scanf("%d",&x);
while(n>0 && (i - heap[1].ord>=k)) elimin(1);
while(n>0 && (heap[1].val>=x))
elimin(1);
adaug(x,i);
if(i>=k-1)
{
//while(n>0 && (i - heap[1].ord==k)) elimin(1);
s+=heap[1].val;
}
}
printf("%lld\n",s);
return 0;
}