Cod sursa(job #824493)
Utilizator | Data | 26 noiembrie 2012 18:03:20 | |
---|---|---|---|
Problema | Deque | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 2.69 kb |
#include <stdio.h>
using namespace std;
long long mx=0,H[5000001],v[5000001],poz[5000001],h=0,n;
void insert()
{
long long k=h,aux;
while(k>1 && H[k]<H[k/2])
{
aux=H[k];
H[k]=H[k/2];
H[k/2]=aux;
v[mx]=k/2;
v[poz[k/2]]=k;
aux=poz[k/2];
poz[k/2]=poz[k];
poz[k]=aux;
k=k/2;
}
}
int minim()
{
return H[1];
}
int pozminima(long long a,long long b)
{
if(H[a]<H[b]) return a;
else return b;
}
void down(long long x)
{
long long aux,g,m;
while(1)
{
if (2*x+1<=h){
g=pozminima(2*x,2*x+1);
m=H[g];
if (H[g]<H[x]) {
aux=H[x];
H[x]=H[g];
H[g]=aux;
aux=v[poz[x]];
v[poz[x]]=v[poz[g]];
v[poz[g]]=aux;
aux=poz[x];
poz[x]=poz[g];
poz[g]=aux;
}
else break;
}
else if(2*x<=h) {
g=2*x;
m=H[g];
if(H[g]<H[x]) {
aux=H[x];
H[x]=H[g];
H[g]=aux;
aux=v[poz[x]];
v[poz[x]]=v[poz[g]];
v[poz[g]]=aux;
aux=poz[g];
poz[g]=poz[x];
poz[x]=aux;
}
else break;
}
else break;
x=g;
}
}
void eliminare(long long a)
{
long long pozinheap=v[a];
H[pozinheap]=H[h];
h--;
down(pozinheap);
}
int main()
{
long long a,i,s=0,nr;
FILE*f,*g;
f=fopen("dqheap.in","r");
g=fopen("dqheap.out","w");
fscanf(f,"%lld%lld",&n,&nr);
for(i=1;i<=n+1;i++)
{
fscanf(f,"%lld",&a);
if(i>nr) eliminare(i-nr);
H[++h]=a;
v[++mx]=h;
poz[h]=mx;
insert();
if(i>=nr) s=s+minim();
}
fprintf(g,"%lld",s);
return 0;
}