Cod sursa(job #2811393)

Utilizator FilippppFilip Gruianu Filipppp Data 2 decembrie 2021 10:18:44
Problema Deque Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <cstdio>
#include <iostream>

using namespace std;

const int N=5000000+7;
int n,k,a[N],d[N],st,dr;



void add(int x){/// adauga pe x la final
        dr++;
        d[dr]=x;
}

void popback() {/// sterge elementul de la final
        dr--;
}

void popfront() {/// sterge elementul de la inceput
        st++;
}

signed main() {
        freopen ("deque.in","r",stdin);
        freopen ("deque.out","w",stdout);


        st=1;
        dr=0;


        /**

        st=dr => am un singur element
        st,dr-1
        st,st-1


        d[1]=0
        1...0


        de la st la dr => st<=i<=dr

        1<=i<=0

        st...dr

        st=4
        dr=8

        d[4], d[5], d[6], d[7], d[8]

        adauga elementul 10

        primul element este d[st]
        al doilea d[st+1]
        ....
        ultimul d[dr]

        1 2 3 4 5 ... n


        (2 3 4 5 6 7 8 9)



        **/


        scanf("%d%d",&n,&k);


        for (int i=1;i<=n;i++){
                scanf("%d",&a[i]);
        }


        long long sum=0;
        for (int i=1;i<=n;i++){
                while (st<=dr&&a[i]<=a[d[dr]]){
                        dr--;
                }
                add(i);

                if(d[st]<=i-k) {
                        popfront();
                }
                if(i>=k){
                        sum+=a[d[st]];
                }
        }

        printf("%lld\n",sum);

        return 0;
}

/**

**/