Cod sursa(job #1046713)

Utilizator Iustin_BulimarFMI Iustin Bulimar Iustin_Bulimar Data 3 decembrie 2013 13:21:59
Problema Deque Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <fstream>
using namespace std;
ifstream cin("deque.in");
ofstream cout("deque.out");

int n, k, p[5000001], i, nr, x, l;
long long s;
struct heap
{
    int v, nr;
};
heap h[5000001];

void schimba(int i, int j)
{
    swap(h[i], h[j]);
    p[h[i].nr]=i;
    p[h[j].nr]=j;
}
void push(int x, int l, int nr)
{
    int i=l;
    h[i].v=x;
    h[i].nr=nr;
    p[nr]=i;
    while(h[i/2].v>h[i].v && i>1)
    {
        schimba(i/2, i);
        i/=2;
    }
}
int minim(int i)
{
    if(i*2>l) return 0;
    else
    {
        if(i*2+1>l) return i*2;
        if(h[i*2].v<h[i*2+1].v) return i*2;
        return i*2+1;
    }
}
void pop(int i)
{
    int j;
    schimba(i, l--);
    j=minim(i);
    while(i<=l && h[i].v>h[j].v && j)
    {
        schimba(i, j);
        i=j;
        j=minim(i);
    }
}
int main()
{
    cin>>n>>k;
    for(i=1; i<=n; i++)
    {
        cin>>x;
        push(x, ++l,++nr);
        if(l>k) pop(p[nr-k]);
        if(l==k) s+=h[1].v;
    }
    cout<<s;
    return 0;
}