Pagini recente » Cod sursa (job #125119) | Cod sursa (job #549120) | Cod sursa (job #2252104) | rar23 | Cod sursa (job #633622)
Cod sursa(job #633622)
#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],alCateleaAFostInserat,lungimeHeap;
int n,kk,a[MAX_N],minim=0;
void coboaraInHeap(int k)
{
int fiu;
do
{
fiu = 0;
if(2*k<=lungimeHeap)
{
fiu = 2*k;
if(2*k+1 <= lungimeHeap && a[heap[2*k+1]]<a[heap[2*k]])
fiu = 2*k+1;
}
if(a[heap[fiu]] >= a[heap[k]])
fiu = 0;
if(fiu)
{
int aux=heap[fiu];
heap[fiu]=heap[k];
heap[k]=aux;
k = fiu;
}
}while(fiu);
}
void urcaInHeap(int k)
{
int val = heap[k];
while(k>1 && a[val]<a[heap[k/2]])
{
heap[k]=heap[k/2];
p[a[heap[k]]]=k;
k/=2;
}
heap[k]=val;
p[a[heap[k]]] = k;
}
void inserare(int pozInA)
{
lungimeHeap++;
heap[lungimeHeap]= pozInA;
p[heap[lungimeHeap]] = pozInA;
urcaInHeap(lungimeHeap);
}
void stergere(int k)
{
heap[k]=heap[lungimeHeap];
p[a[heap[k]]] = k;
lungimeHeap--;
if(k>1 && a[heap[k]]<a[heap[k/2]])
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()
{
//for(int i=1;i<=n;i++)
//printf("%d ",a[i]);
printf("%d\n",minim);
}
void rezolvare()
{
for(int i=1;i<=kk;i++)
inserare(i);
//printf("%d ",a[heap[1]]);
minim += a[heap[1]];
//for(int j=1;j<=lungimeHeap;j++)
//printf("%d ",heap[j]);
//printf("\n");
for(int i=1;i<=n-kk;i++)
{
stergere(p[a[i]]);
inserare(i+kk);
//printf("%d ",a[heap[1]]);
minim+=a[heap[1]];
//for(int j=1;j<=lungimeHeap;j++)
//printf("%d ",heap[j]);
//printf("\n");
}
//printf("\n");
}
int main()
{
freopen("deque.in","rt",stdin);
freopen("deque.out","wt",stdout);
citire();
rezolvare();
afisare();
return 0;
}