Cod sursa(job #47130)

Utilizator marius135Dumitran Adrian Marius marius135 Data 3 aprilie 2007 12:54:39
Problema Schi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include<stdio.h>
#define max 32*1024

long v[max];
long st[max];
long dr[max];
long valdr[max],next=1;
long hst[max];
long hdr[max];

long adauga(long a,long b,long c,long d)
{
	if(a==1) {v[1] = a;return 1;}
	long w;
	if(v[b] == 0) {v[b] = a; return d;}
	if(valdr[b] >= c) 
		{
		if(dr[b]==0) dr[b]=++next;
		valdr[b]++;
		w = adauga(a,dr[b],c,d+1);
		if(w-d>hdr[b]) hdr[b] = w-d;
		return w;
		}
	if(st[b]==0) st[b]=++next;
	w = adauga(a,st[b],c-valdr[b]-1,d+1);
	if(w-d>hst[b]) hst[b] = w-d;
	return w;
	
}

void drs(long a)
{
	if(v[a]==0) return;
	drs(dr[a]);
	printf("%ld\n",v[a]);
	drs(st[a]);
}
int main()
{
	long i,n,x,a,b,c,rad=1;
	freopen("schi.in","r",stdin);
	freopen("schi.out","w",stdout);
	
	scanf("%ld",&n);
	for(i=1;i<=n;i++)
		{
		scanf("%ld",&x);
		adauga(i,1,x-1,1);
		if(hdr[rad]>hst[rad]+1)
			{
			a = dr[rad];
			b = hst[a];
			hst[a] = hst[rad ]+1;
			hdr[rad ] = b;
			c = st[a];
			st[a] = rad ;
			dr[rad ] = c;
			rad = a;
			}
		if(hst[rad ]>hdr[rad ]+1)
			{
			a = st[rad];
			b = hdr[a];
			hdr[a] = hdr[rad ]+1;
			hst[rad ] = b;
			c = dr[a];
			dr[a] = rad ;
			st[rad ] = c;
			rad = a;
			
			}
		}
	i++;
	
	drs(rad);
		
	
	
	
	return 0;
}