Pagini recente » Cod sursa (job #2259613) | Cod sursa (job #2119400) | Cod sursa (job #2251476) | Cod sursa (job #2164720) | Cod sursa (job #1088264)
#include <cstdio>
using namespace std;
int heap[5000100];
int vtoheap[5000100];
int heaptov[5000100];
int nrheap;
void hswap( int poz1, int poz2 )
{
int t;
t = heap[poz1];
heap[poz1] = heap[poz2];
heap[poz2] = t;
vtoheap[heaptov[poz1]] = poz2;
vtoheap[heaptov[poz2]] = poz1;
t = heaptov[poz1];
heaptov[poz1] = heaptov[poz2];
heaptov[poz2] = t;
}
void upheap( int poz )
{
if ( poz == 1 )
return;
if ( heap[poz] < heap[poz/2] )
{
hswap( poz, poz/2 );
upheap( poz/2 );
}
}
void downheap( int poz )
{
if ( ( heap[poz] > heap[poz*2] ) && ( poz * 2 <= nrheap ) )
{
if ( ( heap[poz*2] > heap[poz*2+1] ) && ( poz * 2 + 1 <= nrheap ) )
{
hswap( poz, poz*2+1 );
downheap( poz*2+1 );
}
else
{
hswap( poz, poz*2 );
downheap( poz*2 );
}
}
else
{
if ( ( heap[poz] > heap[poz*2+1] ) && ( poz * 2 + 1 <= nrheap ) )
{
hswap( poz, poz*2+1 );
downheap( poz*2+1 );
}
}
}
void add( int x, int vpoz )
{
heap[++nrheap] = x;
heaptov[nrheap] = vpoz;
vtoheap[vpoz] = nrheap;
upheap( nrheap );
}
void hreplace( int poz, int x, int vpoz )
{
heap[poz] = x;
heaptov[poz] = vpoz;
vtoheap[vpoz] = poz;
if ( heap[poz] < heap[poz/2] )
{
upheap( poz );
}
else
{
downheap( poz );
}
}
int main()
{
freopen( "deque.in", "r", stdin );
freopen( "deque.out", "w", stdout );
int n, k, i;
int dummy;
long long s = 0;
scanf( "%d %d\n", &n, &k );
for ( i = 1; i <= k; ++i )
{
scanf( "%d\n", &dummy );
add( dummy, i );
}
for ( i = k + 1; i <= n ; ++i )
{
scanf( "%d\n", &dummy );
s += heap[1];
hreplace( vtoheap[i-k], dummy, i );
}
s += heap[1];
printf( "%lld\n", s );
fclose( stdin );
fclose( stdout );
return 0;
}