Cod sursa(job #2724712)

Utilizator Radu_FilipescuFilipescu Radu Radu_Filipescu Data 17 martie 2021 18:21:19
Problema Deque Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.46 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin( "deque.in" );
ofstream fout( "deque.out" );

class deq {
    private:
        struct nod {
            int first, second;
            nod *lf, *rg;
        };

        nod *fr, *bk;
        int qsize;

    public:
        deq() {
            fr = bk = NULL;
            qsize = 0;
        }
        void pushfront( int a, int b ) {
            nod *tmp = new nod;

            tmp -> first = a;
            tmp -> second = b;
            tmp -> rg = fr;
            tmp -> lf = NULL;

            if( fr != NULL )
                fr -> lf = tmp;
            fr = tmp;

            ++qsize;
            if( bk == NULL ) bk = fr;
        }
        void pushback( int a, int b ) {
            nod *tmp = new nod;

            tmp -> first = a;
            tmp -> second = b;
            tmp -> lf = bk;
            tmp -> rg = NULL;

            if( bk != NULL )
                bk -> rg = tmp;
            bk = tmp;

            ++qsize;
            if( fr == NULL ) fr = bk;
        }
        void popfront() {
            if( qsize == 0 ) return;

            --qsize;
            nod *tmp = fr;

            fr = fr -> rg;
            if( fr )
                fr -> lf = NULL;
            delete tmp;

            if( qsize == 0 ) fr = bk = NULL;
        }
        void popback() {
            if( qsize == 0 ) return;

            --qsize;
            nod *tmp = bk;

            bk = bk -> lf;
            if( bk )
                bk -> rg = NULL;

            delete tmp;

            if( qsize == 0 ) fr = bk = NULL;
        }
        pair<int,int> qback() {
            if( qsize == 0 ) return { -1, -1 };
            return { bk -> first, bk -> second };
        }
        pair<int,int> qfront() {
            if( qsize == 0 ) return { -1, -1 };
            return { fr -> first, fr -> second };
        }
        int Qsize() {
            return qsize;
        }
};

deq Q;
int n, k;
long long sum;

int main()
{
    fin >> n >> k;

    int x;
    for( int i = 1; i <= n; ++i ) {
        fin >> x;

        if( Q.Qsize() && i - Q.qfront().second == k )
            Q.popfront();

        while( Q.Qsize() && x < Q.qback().first )
            Q.popback();

        Q.pushback( x, i );

        if( i >= k )
            sum += Q.qfront().first;
    }

    fout << sum << '\n';

    fin.close();
    fout.close();

    return 0;
}