Cod sursa(job #2724878)

Utilizator DianaIfrosaIfrosa Diana DianaIfrosa Data 18 martie 2021 00:34:14
Problema Deque Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("deque.in");
ofstream fout("deque.out");

//global pentru ca sunt array uri mari
int n,k,v[5000001];
int deque[5000001];
int front,back;

void Read()
{
    fin>>n>>k;
    for(int i=0;i<n;i++)
        fin>>v[i];

    fin.close();
}
void Do()
{
    long long sum=0;
    //pastrez in deque pozitiile si nu valorile
    // pentru a putea tine cont cand se misca "pointerul" peste secventa
    int current;

    //initializare
    front=0,back=-1;

    for(int i=0;i<n;i++)
    {
       current=v[i];
       while(front<=back && current<=v[deque[back]])
           back--; //elimin elementele mai mari (sau egale!)  decat cel curent
           //pentru a pastra in deque minimele
       //adaug curentul in deque
       deque[++back]=i;

       if(deque[front]==i-k) //minimul curent nu mai face parte din noua secventa (i,i-1,...,i-(k-1))
           front++;

       if(i>=k-1)
         sum+=v[deque[front]]; //adaug minimul la suma

    }

  fout<<sum;

}
int main()
{
    Read();
    Do();


    return 0;
}