Cod sursa(job #2434386)

Utilizator AndreiStanescuAlloys Nokito AndreiStanescu Data 1 iulie 2019 17:39:18
Problema Deque Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.65 kb
//vila-campion
/*#include<bits/stdc++.h>
using namespace std;

deque < pair<int,int> > Min,Max;
int ans;

int main()
{
    int n,k,i,x;
    ifstream fin("vila2.in");
    ofstream fout("vila2.out");
    fin>>n>>k;
    for(i=1;i<=k;i++)
    {
        fin>>x;
        while(!Max.empty() && Max.back().first<=x )
            Max.pop_back();
        Max.push_back(make_pair(x,i));
        while(!Min.empty() && Min.back().first>=x  )
            Min.pop_back();
        Min.push_back(make_pair(x,i));

    }

    ans=Max.front().first-Min.front().first;
    //cout<<ans;

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

        if(Max.front().second<i-k)
            Max.pop_front();
        if(Min.front().second<i-k)
            Min.pop_front();
        while(!Max.empty() && Max.back().first<=x )
            Max.pop_back();
        Max.push_back(make_pair(x,i));
        while(!Min.empty() && Min.back().first>=x )
            Min.pop_back();
        Min.push_back(make_pair(x,i));
        ans=max(ans,Max.front().first-Min.front().first);

    }
    fout<<ans;
    fin.close();
    fout.close();

}*/
//deque-infoarena
/*#include<stdio.h>
int D[5000010],A[5000010];
unsigned long long s;
//creez un deque in care retin pozitiile sirului T[i], in care T[i1] este minimul cautat

int main()
{
    int i,n,k,p=1,u=0,x;
    freopen("deque.in","r",stdin);
    freopen("deque.out","w",stdout);

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

    for(i=1;i<=k;i++)
    {   scanf("%d ",&A[i] );
    //cout<<A[i];
        while(p<=u && A[D[u]]>A[i])
            u--;
        D[++u]=i;
    }
    s+=A[D[p]];
    //printf("%d",s);

    for(i=k+1;i<=n;i++)
    {
        scanf("%d ",&A[i] );
        if(D[p]==i-k) p++;
        while(p<=u && A[D[u]]>A[i])
            u--;
        D[++u]=i;
        s+=A[D[p]];
    }
    printf("%d",s);
}*/
#include<bits/stdc++.h>
using namespace std;

deque < pair<int,int> > Min;
long long ans;

int main()
{
    int n,k,i,x;
    ifstream fin("deque.in");
    ofstream fout("deque.out");
    fin>>n>>k;
    for(i=1;i<=k;i++)
    {
        fin>>x;
        while(!Min.empty() && Min.back().first>=x  )
            Min.pop_back();
        Min.push_back(make_pair(x,i));

    }

    ans=Min.front().first;
    //cout<<ans;

    for(i=k+1;i<=n;i++)
    {
        fin>>x;
        if(Min.front().second==i-k)
            Min.pop_front();
        while(!Min.empty() && Min.back().first>=x )
            Min.pop_back();
        Min.push_back(make_pair(x,i));
        ans+=Min.front().first;

    }
    fout<<ans;
    fin.close();
    fout.close();

}