Cod sursa(job #2885983)

Utilizator T_george_TGeorge Teodorescu T_george_T Data 6 aprilie 2022 20:25:19
Problema Deque Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
#include <iostream>
#include <fstream>
#include <stack>
#include <cstring>
#include <vector>
using namespace std;

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

const int NMAX=5e6+3;
class Deque{
    int *d,st,dr,size;
public:
    Deque(int size=0){
        st=-1;
        dr=-1;
        this->size=size;
        d=new int[size];
    }
    void push_back(int val);
    void pop_back();
    void push_front(int val);
    void pop_front();
    int front(){
        if(!empty())
            return d[st];
        return -1;
    }
    int back(){
        if(!empty())
            return d[dr];
        return -1;
    }
    bool full(){
        return ((st==0 && dr==size-1) || st==dr+1);
    }
    bool empty(){
        return (st==-1);
    }

};
void Deque::push_back(int val) {
    if(full())
        return;
    if(st==-1)
        st=dr=0;
    else if(dr==size-1)
        dr=0;
    else
        dr++;
    d[dr]=val;
}
void Deque::pop_back(){
    if(empty())
        return;
    if(dr==st)
        st=-1;
    else if(dr==0)
        dr=size-1;
    else
        dr--;
}
void Deque::push_front(int val){
    if(full())
        return;
    if(st==-1)
        st=dr=0;
    else if(st==0)
        st=size-1;
    else
        st--;
    d[st]=val;
}
void Deque::pop_front(){
    if(empty())
        return;
    if(dr==st)
        st=-1;
    else if(st==size-1)
        st=0;
    else
        st++;
}
int d[NMAX],v[NMAX];
int main() {
    int dr=0,n,k;
    long long sum=0;
    in>>n>>k;
    Deque d(n);
    for(int i=0;i<n;i++)
        in>>v[i];
    for(int i=0;i<n;i++){
        while(!d.empty() && v[d.front()]>v[i])
            d.pop_front();
        while(!d.empty() && i-d.back()>=k)
            d.pop_back();
        d.push_front(i);
        if(i>=k-1){
            sum+=1LL*v[d.back()];
        }
    }
    out<<sum;
    return 0;
}