Cod sursa(job #1196781)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 9 iunie 2014 00:56:30
Problema Deque Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <cstdio>
#include <deque>

#define DIM 1666013
#define Nmax 5000005

using namespace std;
char buff[DIM];
int poz = DIM - 1;

int scan(int &A)
{
    A = 0;
    int sign = 1;
    while(('0' > buff[poz] || buff[poz] > '9') && buff[poz] != '-')
        if(++ poz == DIM)
            fread(buff,1,DIM,stdin),poz = 0;
    while(('0' <= buff[poz] && buff[poz] <= '9' ) || buff[poz] == '-')
    {
        if(buff[poz] == '-') sign *= -1;
        else A = A * 10 + buff[poz] - 48;
        if(++poz == DIM)
            fread(buff,1,DIM,stdin),poz = 0;
    }
    A *= sign;
}
int v[Nmax],N,K;
deque<int> Q;

int main()
{
    freopen("deque.in","r",stdin);
    freopen("deque.out","w",stdout);
    scan(N),scan(K);
    long long sum = 0;
    for(int i = 1; i <= N; ++i)scan(v[i]);
    for(int i = 1; i <= N; ++i)
    {
        while(!Q.empty() && v[Q.back()] > v[i])
            Q.pop_back();
        Q.push_back(i);
        while(!Q.empty() && Q.front() <= i - K )
            Q.pop_front();
        if(i >= K)
            sum += v[Q.front()];
    }
    printf("%lld\n",sum);
    return 0;
}