Pagini recente » Cod sursa (job #1772006) | Cod sursa (job #2562857) | Cod sursa (job #2802536) | Cod sursa (job #539288) | Cod sursa (job #633629)
Cod sursa(job #633629)
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAX_N = 5000005;
const int MAX_HEAP_SIZE = 8388610;
int heap[MAX_N],p[MAX_N],lungimeHeap;
int n,kk;
int a[MAX_N];
long long minim=0;
void coboaraInHeap(int k)
{
int fiu;
do
{
fiu = 0;
if(k<<1 <= lungimeHeap)
{
fiu = k<<1;
if(fiu+1 <= lungimeHeap && a[heap[fiu+1]]<a[heap[fiu]])
fiu++;
}
if(a[heap[fiu]] >= a[heap[k]])
fiu = 0;
if(fiu)
{
int aux=heap[fiu];
heap[fiu]=heap[k];
heap[k]=aux;
p[heap[k]]=k;
p[heap[fiu]]=fiu;
k = fiu;
}
}while(fiu);
}
void urcaInHeap(int k)
{
int val = heap[k];
while(k>1 && a[val]<a[heap[k>>1]])
{
heap[k]=heap[k>>1];
p[heap[k]]=k;
k>>=1;
}
heap[k]=val;
p[heap[k]] = k;
}
void inserare(long long pozInA)
{
lungimeHeap++;
heap[lungimeHeap]= pozInA;
p[heap[lungimeHeap]] = lungimeHeap;
urcaInHeap(lungimeHeap);
}
void stergere(long long k)
{
heap[k]=heap[lungimeHeap];
p[heap[k]] = k;
lungimeHeap--;
if(k>1 && a[heap[k]]<a[heap[k>>1]])
urcaInHeap(k);
else
coboaraInHeap(k);
}
void citire()
{
scanf("%d %d",&n,&kk);
for(int i=1;i<=n;++i)
scanf("%d",&a[i]);
}
void afisare()
{
printf("%lld\n",minim);
}
void rezolvare()
{
for(int i=1;i<=kk;++i)
inserare(i);
minim += a[heap[1]];
for(int i=1;i<=n-kk;++i)
{
stergere(p[i]);
inserare(i+kk);
minim+=a[heap[1]];
}
}
int main()
{
freopen("deque.in","rt",stdin);
freopen("deque.out","wt",stdout);
citire();
rezolvare();
afisare();
return 0;
}