Cod sursa(job #1052618)

Utilizator The_DisturbedBungiu Alexandru The_Disturbed Data 11 decembrie 2013 16:59:54
Problema Deque Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include<stdio.h>
#define max 10000000
int h[5000013],m,n,i,j,k,el[625013];
long long s;
struct point
{
	int x;
	point *y;
}*p,*u,*q;
inline void elimina(int x)
{
	x+=max;
	el[x/32]|=1<<(x%32);
}
inline void eliminat(int x)
{
	x+=max;
	int aux;
	for(int i=0;i<32;++i)
		if(i!=x%32)aux|=(1<<i);
	el[x/32]&=aux;
}
inline bool trebuie(int x)
{
	x+=max;
	if(el[x/32]&(1<<(x%32)))return 1;
	return 0;
}
inline void swap(int a,int b)
{
	int aux=h[a];
	h[a]=h[b];
	h[b]=aux;
}
void heapup(int i)
{
	if(i==1)return;
	if(h[i]<h[i/2])
	{
		swap(i,i/2);
		heapup(i/2);
	}
}
void heapdown(int i)
{
	if(i*2>n)return;
	int st,dr;
	st=h[i*2];
	if(i*2+1>n)dr=st+1;
	else dr=h[i*2+1];
	if(h[i]<st && h[i]<dr)return;
	if(st<dr)
	{
		swap(i,i*2);
		heapdown(i*2);
	}
	else
	{
		swap(i,i*2+1);
		heapdown(i*2+1);
	}
}
void gtfo()
{
	eliminat(h[1]);
	swap(1,n);
	--n;
	heapdown(1);
}
int main()
{
	freopen("deque.in","r",stdin);
	freopen("deque.out","w",stdout);
	scanf("%d%d",&m,&k);
	s=0;
	p=new point;
	p->y=NULL;
	u=p;
	for(i=1;i<k;++i)
	{
		scanf("%d",&h[i]);
		q=new point;
		q->x=h[i];
		q->y=NULL;
		u->y=q;
		u=q;
		heapup(i);
	}
	q=p;
	p=p->y;
	delete(q);
	n=k-1;
	for(i=k;i<=m;++i)
	{
		++n;
		scanf("%d",&h[n]);
		q=new point;
		q->x=h[n];
		q->y=NULL;
		u->y=q;
		u=q;
		heapup(n);
		s+=h[1];
		elimina(p->x);
		q=p;
		p=p->y;
		delete(q);
		while(trebuie(h[1]))gtfo();
	}
	printf("%lld",s);
	return 0;
}