Pagini recente » Cod sursa (job #2589575) | Cod sursa (job #630303) | Cod sursa (job #1002699) | Cod sursa (job #1402922) | Cod sursa (job #674093)
Cod sursa(job #674093)
#include <cstdio>
#include <algorithm>
#define MAXN 5000001
int n, k;
int a[MAXN];
long long sum;
int heap[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 ];
while( node > 1 && a[ heap[ node / 2 ] ] > a[ value ] )
{
heap[ node ] = heap[ node / 2 ];
node = node / 2;
}
heap[ node ] = value;
}
void push(int k)
{
size++;
heap[ 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
&& a[ heap[ 2 * node ] ] > a[ heap[ 2 * node + 1] ] )
son = 2 * node + 1;
if( a[ heap[ son ] ] < a[ heap[ node ] ] )
{
std::swap(heap[ son ], heap[ node ]);
node = son;
}
else
son = 0;
}
} while(son);
}
void pop(int node)
{
heap[ node ] = heap[ size ];
size--;
if( (node > 1) && (a[ heap[ node ] ] < a[ heap[ node / 2 ] ]) )
percolate( node );
else
sift( node );
}
void solve()
{
for(int i = 1; i <= n; ++i)
{
push(i);
if( i >= k )
{
while( heap[1] <= i - k ) pop(1);
sum += a[ heap[ 1 ] ] ;
}
}
}
void printResult()
{
printf("%lld\n", sum);
}
int main()
{
read();
solve();
printResult();
return 0;
}