Pagini recente » Cod sursa (job #602737) | Cod sursa (job #441670) | Cod sursa (job #2444209) | Cod sursa (job #2970223) | Cod sursa (job #1053266)
#include<iostream>
#include<fstream>
using namespace std;
typedef struct heap
{
int ord,val;
} HE;
HE h[10000005];
int p[5000002],nr=0; //p[i]=pozitia in heap a al i-lea element introdus
void insert(int x, int ord)
{
int poz,p2;
h[++nr].val=x;
h[nr].ord=ord;
p[ord]=nr;
poz=nr;
p2=poz/2;
while (h[poz].val<h[p2].val && p2>=1)
{
int t=p[h[poz].ord];
HE aux=h[poz];
p[h[poz].ord]=p[h[p2].ord];
h[poz]=h[p2];
p[h[p2].ord]=t;
h[p2]=aux;
poz=p2;
p2=poz/2;
}
}
void sterge(int ord)
{
int po=p[ord],poz,p2,p21;
poz=po;
p2=po*2;
p21=po*2+1;
h[po]=h[nr--];
p[h[po].ord]=po;
while ((h[po].val>h[p2].val && p2<=nr) || (h[po].val>h[p21].val && p21<=nr))
{if (p2<=nr && p21<=nr && h[p21].val<h[p2].val)
{
int t=p[h[po].ord];
HE aux=h[po];
p[h[po].ord]=p[h[p21].ord];
h[po]=h[p21];
p[h[p21].ord]=t;
h[p21]=aux;
po=p21;
}
else
{
int t=p[h[po].ord];
HE aux=h[po];
p[h[po].ord]=p[h[p2].ord];
h[po]=h[p2];
p[h[p2].ord]=t;
h[p2]=aux;
po=p2;
}
p2=po*2;
p21=po*2+1;
}
p2=poz/2;
while (h[poz].val<h[p2].val && p2>=1)
{
int t=p[h[poz].ord];
HE aux=h[poz];
p[h[poz].ord]=p[h[p2].ord];
h[poz]=h[p2];
p[h[p2].ord]=t;
h[p2]=aux;
poz=poz/2;
p2=poz/2;
}
}
int main()
{
int i,n,in=0,x,a,k;
long long s=0;
ifstream f("deque.in");
ofstream g("deque.out");
f>>n>>k;
for (i=1; i<k; i++)
{
f>>a;
++in;
insert(a,in);
}
for (i=k; i<=n; i++)
{
f>>a;
++in;
if (a<=h[1].val) { h[1].val=a; h[1].ord=in; p[in]=1;}
else insert(a,in);
while (h[1].ord<i-k+1) sterge(h[1].ord);
s+=h[1].val;
}
g<<s;
return 0;
}