Pagini recente » Cod sursa (job #1834599) | Cod sursa (job #2683000) | Cod sursa (job #919055) | Cod sursa (job #2160073) | Cod sursa (job #468342)
Cod sursa(job #468342)
#include <stdlib.h>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
long long aib[4500001];
long long vec[4500001];
long long n,m,nr,o,a,b;
#define ZERO(x) ( (x) & (-x) )
#define INF (0x5f5f5f5f)
inline long long query(long long a,long long b) {
long long vmin = INF;
if(a>b) return vmin;
for(int i = b ; i >= a ; )
if(i - ZERO(i) + 1 >= a )
vmin = min( vmin , aib[i]) , i -= ZERO(i);
else
vmin = min( vmin , vec[i]) , i--;
return vmin;
}
inline void construct(int p, int nr) {
vec[p] = nr;
aib[p] = min( aib[p] , min( query(p - ZERO(p) + 1 , p - 1 ) , vec[p] ) );
if( p + ZERO(p) <= n )
aib[ p + ZERO(p) ] = min( aib[p + ZERO(p) ] , vec[p] );
}
int main(int argc, char** argv) {
freopen("deque.in","r",stdin);
freopen("deque.out","w",stdout);
scanf("%lld %lld",&n,&m);
//for(int i = 0 ; i <= n ; i++ )
// aib[ i ] = INF;
memset(aib,INF,sizeof(aib));
for(int i = 1 ; i <= n ; i++) {
scanf("%lld",&nr);
construct(i,nr);
}
long long sum = 0;
for(int i = 1 ; i + m - 1 <= n ; i++ ) {
sum += query( i , i + m - 1 );
}
printf("%lld\n",sum);
return 0;
}