Cod sursa(job #2889464)

Utilizator bianca2002Bianca bianca2002 Data 12 aprilie 2022 20:00:42
Problema Deque Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.09 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("deque.in");
ofstream g("deque.out");

class deq{

int v[5000001], i, f;

public:

    deq();

    void push_back(int);
    void pop_back();
    void pop_front();
    int front();
    int back();
    int size();

};

deq::deq()
{
    i = -1;
    f = -1;
}

int deq::size()
{
    if(i==-1&&f==-1)
        return 0;
    else return f-i+1;
}

int deq::front()
{
    return v[i];
}

int deq::back()
{
    return v[f];
}

void deq::push_back(int x)
{
    if(i==-1)
    {
        i++;
        f++;
    }
    else
    {
        f++;
    }

    v[f] = x;
}

void deq::pop_back()
{

        if(i==f)
        {
            i=-1;
            f=-1;
        }
        else
            f--;

}

void deq::pop_front()
{

        if(i==f)
        {
            i=-1;
            f=-1;
        }
        else i++;

}


int main()
{
    deq coada, coada_pozitii;

    int n, k, i, j, suma=0, x;

    f>>n>>k;



    for(i=0;i<n;i++)
    {
        f>>x;
        if(coada.size()==0)
            {
                coada.push_back(x);
                coada_pozitii.push_back(i);
            }
        else
        {



            if(coada_pozitii.front()<=i-k)
            {
                suma += coada.front();

                coada_pozitii.pop_front();
                coada.pop_front();
            }
            else if(i>k)
            {
                suma+=coada.front();
            }


            while(coada.back()>=x && coada.size())
            {
                coada.pop_back();
                coada_pozitii.pop_back();
            }
            coada.push_back(x);
            coada_pozitii.push_back(i);



        }
    }

                if(coada_pozitii.front()<=i-k)
            {
                suma += coada.front();
                coada_pozitii.pop_front();
                coada.pop_front();
            }
            else if(i>k)
            {

                suma+=coada.front();
            }
    g<<suma;
}