Pagini recente » Cod sursa (job #1244856) | Cod sursa (job #65898) | Cod sursa (job #3178545) | Cod sursa (job #2294553) | Cod sursa (job #824856)
Cod sursa(job #824856)
#include<fstream>
using namespace std;
ifstream fin("deque.in");
ofstream fout("deque.out");
struct h{int inf;
int poz;
};
h heap[5000000];
int j=0,aux,k,s;
void add(int i)
{
int x;
fin>>x;
heap[++j].inf=x;
heap[j].poz=i;
int j2;
j2=j;
while(j>1&&heap[j/2].inf>heap[j].inf)
{
aux=heap[j/2].inf;
heap[j/2].inf=heap[j].inf;
heap[j].inf=aux;
aux=heap[j/2].poz;
heap[j/2].poz=heap[j].poz;
heap[j].poz=aux;
j=j/2;
}
j=j2;
}
void remove()
{ int u,p;
heap[1].inf=heap[j].inf;
heap[1].poz=heap[j].poz;
heap[j].inf=0;
j--;
u=1;
while(2*u<=j&&(heap[2*u].inf<heap[u].inf||((2*u+1<=j)&&heap[2*u+1].inf<heap[u].inf) ) )
{
if(2*u+1<=j&&heap[2*u+1].inf<heap[2*u].inf)p=2*u+1;
else p=2*u;
aux=heap[p].inf;
heap[p].inf=heap[u].inf;
heap[u].inf=aux;
aux=heap[p].poz;
heap[p].poz=heap[u].poz;
heap[u].poz=aux;
u=p;
}
}
void afisare(int i)
{
while(heap[1].poz<i-k+1)remove();
s+=heap[1].inf;
}
int main()
{
int n,i;
fin>>n;
fin>>k;
for(i=1;i<=n;i++)
{add(i);
if(i>=k)afisare(i);
}
fout<<s;
return 0;
}