Pagini recente » Cod sursa (job #2191085) | Cod sursa (job #1058969) | Cod sursa (job #3036483) | Cod sursa (job #634064) | Cod sursa (job #828850)
Cod sursa(job #828850)
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 5000001
int n, k ;
int v[maxn] ;
int heap[maxn] ;
int poz[maxn] ;
bool sters[maxn] ;
int nrheap ;
void schimba(int a,int b)
{
swap ( heap[a] , heap[b] ) ;
poz[ heap[a] ] = a ;
poz[ heap[b] ] = b ;
}
void urca(int unde)
{
while( unde > 1 && v[ heap[unde] ] < v[ heap[ unde / 2 ] ] )
{
schimba( unde, unde / 2 ) ;
unde /= 2 ;
}
}
void coboara(int unde)
{
int fiust = 2 * unde ;
int fiudr = 2 * unde + 1 ;
int ajunge = unde ;
if( fiust <= nrheap && v[ heap[fiust] ] < v[ heap[ajunge] ] )
ajunge = fiust ;
if( fiudr <= nrheap && v[ heap[fiudr] ] < v[ heap[ajunge] ] )
ajunge = fiudr ;
if( unde != ajunge )
{
schimba( unde, ajunge ) ;
coboara( ajunge ) ;
}
}
int main()
{
freopen("deque.in", "r", stdin);
freopen("deque.out", "w", stdout);
scanf("%d%d", &n, &k);
for(int i = 1; i <= n; ++i )
scanf("%d", &v[i]);
for(int i = 1; i <= k; ++i)
{
heap[++nrheap] = i ;
poz[i] = nrheap ;
urca( nrheap ) ;
}
long long rez = 0 ;
for(int i = k + 1; i <= n; ++i )
{
rez += v[ heap[1] ] ;
heap[++nrheap] = i ;
poz[i] = nrheap ;
urca( nrheap ) ;
sters[ i - k ] = true ;
while( sters[ heap[1] ] == true )
{
heap[1] = heap[nrheap] ;
poz[ heap[nrheap] ] = 1 ;
coboara( 1 ) ;
}
}
rez += v[ heap[1] ] ;
printf("%lld\n", rez);
return 0;
}