Pagini recente » Cod sursa (job #71554) | Cod sursa (job #1364988) | Cod sursa (job #227679) | Cod sursa (job #3126343) | Cod sursa (job #47150)
Cod sursa(job #47150)
#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,w;
freopen("schi.in","r",stdin);
freopen("schi.out","w",stdout);
scanf("%ld",&n);
for(i=1;i<=n;i++)
{
scanf("%ld",&x);
adauga(i,rad,x-1,1);
if(hdr[rad]>hst[rad]+1)
{
a = dr[rad];
b = hst[a];
valdr[rad] = valdr[rad]-valdr[a]-1;
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];
valdr[a] = valdr[rad]+1;
hdr[a] = hdr[rad ]+1;
hst[rad ] = b;
c = dr[a];
dr[a] = rad ;
st[rad ] = c;
rad = a;
}
}
i++;
drs(rad);
return 0;
}