Pagini recente » Cod sursa (job #2461132) | Cod sursa (job #1196884) | Cod sursa (job #2055452) | Cod sursa (job #2090225) | Cod sursa (job #674091)
Cod sursa(job #674091)
#include <cstdio>
#include <algorithm>
#define MAXN 5000001
int n, k;
int a[MAXN];
long long sum;
int heap[MAXN], pos[MAXN], size;
void read()
{
freopen("deque.in", "r", stdin);
freopen("deque.out", "w", stdout);
scanf("%d %d ", &n, &k);
for(int i = 1; i <= n; ++i)
{
scanf("%d ", a + i);
}
}
void percolate(int node)
{
int value = heap[ node ];
int k = pos[ node ];
while( node > 1 && heap[ node / 2 ] > value )
{
heap[ node ] = heap[ node / 2 ];
pos [ node ] = pos [ node / 2 ];
node = node / 2;
}
heap[ node ] = value;
pos [ node ] = k;
}
void push(int k)
{
size++;
heap[ size ] = a[ k ];
pos [ size ] = k;
percolate(size);
}
void sift(int node)
{
int son;
do
{
son = 0;
if( 2 * node <= size )
{
son = 2 * node;
if( 2 * node + 1 <= size
&& heap[ 2 * node ] > heap[ 2 * node + 1] )
son = 2 * node + 1;
if( heap[ son ] < heap[ node ] )
{
std::swap(heap[ son ], heap[ node ]);
std::swap(pos [ son ], pos [ node ]);
node = son;
}
else
son = 0;
}
} while(son);
}
void pop(int node)
{
heap[ node ] = heap[ size ];
pos [ node ] = pos [ size ];
size--;
if( (node > 1) && ( heap[ node ] < heap[ node / 2 ]) )
percolate( node );
else
sift( node );
}
void solve()
{
for(int i = 1; i <= n; ++i)
{
push(i);
if( i >= k )
{
while( pos[1] <= i - k ) pop(1);
sum += heap[ 1 ];
}
}
}
void printResult()
{
printf("%lld\n", sum);
}
int main()
{
read();
solve();
printResult();
return 0;
}