Cod sursa(job #468339)

Utilizator nashnash mit nash Data 3 iulie 2010 10:45:12
Problema Deque Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <stdlib.h>
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

long long aib[5000001];
long long vec[5000000];
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;
}