Pagini recente » Cod sursa (job #1227683) | Cod sursa (job #1530559) | Cod sursa (job #51081) | Cod sursa (job #2427772) | Cod sursa (job #1068507)
//
// main.cpp
// deque+
//
// Created by Catalina Brinza on 12/25/13.
// Copyright (c) 2013 Catalina Brinza. All rights reserved.
//
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream in("deque.in");
ofstream out("deque.out");
struct strut
{
int a,b;
};
strut h[5000001];
int fin(int x,int y)
{
if (h[x].a<h[y].a) return x;
else return y;
}
int main()
{
int s=0,nr=0;
strut q;
int n,k,i,x;
in>>n>>k;
for (i=1;i<=k;++i)
{
in>>x;
nr++;
q.a=x;
q.b=i;
h[nr]=q;
int fi=nr;
while (h[fi].a<h[fi/2].a && fi>1)
{
swap(h[fi],h[fi/2]);
fi=fi/2;
}
}
s=h[1].a;
for (i=k+1;i<=n;++i)
{
in>>x;
q.a=x;
q.b=i;
h[++nr]=q;
int fi=nr;
while (h[fi].a<h[fi/2].a && fi>1)
{
swap(h[fi],h[fi/2]);
fi=fi/2;
}
while (!(h[1].b>=i-k+1 && h[1].b<=i))
{
while (h[nr].b<i-k+1) nr--;
swap(h[1],h[nr]);
nr--;
int fi=1;
while(2*fi+1<=nr)
{
int l=fin(2*fi,2*fi+1);
if(!(h[fi].a>h[l].a))
break;
swap(h[fi],h[l]);
fi=l;
}
if (fi*2==nr && h[fi].a>h[fi*2].a) swap(h[fi*2],h[fi]);
}
s+=h[1].a;
}
out<<s;
in.close();
out.close();
return 0;
}