#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define t 5
/* Defining the node structure */
struct nodes
{
double m; // metric//
int s, l; // symbol and level //
struct nodes * ptI, * ptI_plus1, * ptI_minus1;
} ;
typedef struct nodes* node;
node create_node ( int symbol, double weight, int level) {
node temp
= ( node
) malloc ( sizeof ( struct nodes
) ) ; if ( temp == NULL) {
} else {
temp-> s= symbol;
temp-> m= weight;
temp-> l= level;
temp-> ptI = NULL;
temp-> ptI_plus1 = NULL;
temp-> ptI_minus1 = NULL;
/*while (prev->next != NULL) {
prev = prev->next;
}*/
}
return temp;
}
node add_node_i( node hd, int symbol, double weight, int level) {
node temp;
level= level+ 1 ;
temp = create_node( symbol, weight, level) ;
hd-> ptI = temp;
return temp;
}
node add_node_i_plus1( node hd, int symbol, double weight, int level) {
node temp;
level= level+ 1 ;
temp = create_node( symbol, weight, level) ;
hd-> ptI_plus1 = temp;
return temp;
}
node add_node_i_minus1( node hd, int symbol, double weight, int level) {
node temp;
level= level+ 1 ;
temp = create_node( symbol, weight, level) ;
hd-> ptI_minus1 = temp;
return temp;
}
/* Defining the stack structure */
struct stack_node
{
int e;
struct stack_node* nxt;
} ;
typedef struct stack_node* st_nd;
// Initializing the stack
void init_st( st_nd stack_head)
{
printf ( "el co de su madre\n " ) ;
stack_head = NULL;
}
// Entering the elements into stack
st_nd push_st( st_nd stack_head, int data) {
st_nd tmp
= ( st_nd
) malloc ( sizeof ( struct stack_node
) ) ;
if ( tmp
== NULL
) { exit ( 0 ) ; }
tmp-> e= data;
tmp-> nxt = stack_head;
printf ( "tmp->nxt = stack_head %d\n " ,& stack_head
-> e
) ; stack_head = tmp;
printf ( " stack_head=temp %d\n " ,& stack_head
-> e
) ; return stack_head;
}
//Deleting an element from the stack.
st_nd pop_st( st_nd stack_head, int * elemento)
{
st_nd tmp = stack_head;
* elemento = stack_head-> e;
stack_head = stack_head-> nxt;
return stack_head;
}
void display( st_nd stack_head)
{
st_nd current;
current = stack_head;
if ( current!= NULL)
{
do
{
printf ( " TOPE DEL STACK symbol:%d \n " , current
-> e
) ; current = current-> nxt;
}
while ( current!= NULL) ;
}
else
{
printf ( "The Stack is empty\n " ) ; }
}
//sort elements of the stack
void sort_stack( st_nd stack_head, node node1, node node2, node node3) {
//printf("oaaaaaaaaaaaaaaa\n");
if ( node1-> m <= node2-> m && node1-> m <= node3-> m) {
if ( node2-> m <= node3-> m) {
push_st( stack_head, node3-> s) ;
//printf ("simbolotope: %d\n",stack_head->e);
push_st( stack_head, node2-> s) ;
//printf ("simbolotope: %d\n",stack_head->e);
push_st( stack_head, node1-> s) ;
//printf("oaaaaaaaaaaaaaaa\n");
//printf ("simbolotope: %d\n",stack_head->e);
}
else
{ push_st( stack_head, node2-> s) ;
push_st( stack_head, node3-> s) ;
push_st( stack_head, node1-> s) ;
}
}
else if ( node2-> m < node1-> m && node2-> m <= node3-> m) {
if ( node1-> m <= node3-> m) {
push_st( stack_head, node3-> s) ;
push_st( stack_head, node1-> s) ;
push_st( stack_head, node2-> s) ;
}
else {
push_st( stack_head, node1-> s) ;
push_st( stack_head, node3-> s) ;
push_st( stack_head, node2-> s) ;
}
}
else {
if ( node1-> m <= node2-> m) {
push_st( stack_head, node2-> s) ;
push_st( stack_head, node1-> s) ;
push_st( stack_head, node3-> s) ;
//printf ("simbolotope: %d\n",&stack_head->e);
} else {
push_st( stack_head, node1-> s) ;
push_st( stack_head, node2-> s) ;
push_st( stack_head, node3-> s) ;
//printf ("simbolotope: %d\n",&stack_head->e);
}
}
// printf ("simbolotope: %d\n",&stack_head->e);
}
double min_distance( double a, double b, double c) {
double dmin;
if ( a <= b && a <= c) {
dmin= a;
}
else if ( b < a && b <= c) {
dmin= b;
}
else {
dmin= c;
}
return dmin;
}
/*int symbol_min_dist(node node1, node node2, node node3){
int smin;
if(node1->m < node2->m && node1->m < node3->m){
smin=node1->s;
}
else if(node2->m < node1->m && node2->m < node3->m){
smin=node2->s;
}
else{
smin=node3->s;
}
return smin;
}
*/
node head_node( node node1, node node2, node node3) {
node temp;
temp
= ( node
) malloc ( sizeof ( struct nodes
) ) ; if ( temp == NULL) {
}
else {
if ( node1-> m <= node2-> m && node1-> m <= node3-> m) {
temp= node1;
}
else if ( node2-> m < node1-> m && node2-> m <= node3-> m) {
temp= node2;
}
else {
temp= node3;
}
printf ( "New head: m = %lf, s = %d, l = %d\n " , temp
-> m
, temp
-> s
, temp
-> l
) ; return temp;
}
}
int in( double u1, int cmin, int cmax) {
int u0;
u0= rint( u1) ;
if ( u0> cmax)
return cmax;
else
{ if ( u0< cmin)
return cmin;
else
return u0;
}
}
void display_tree ( node head) {
if ( head != NULL)
{
printf ( "m = %lf, s = %d, l = %d\n " , head
-> m
, head
-> s
, head
-> l
) ; display_tree( head-> ptI) ;
display_tree( head-> ptI_plus1) ;
display_tree( head-> ptI_minus1) ;
}
}
//Zig Zag decoder algorithm
void ZZ( double * y, double R[ t] [ t] , int lg, int col, int tr, int k, int * sf) {
//local variables
int i, j;
tr= tr- 1 ; //Matrix index
node root, node1, node2, node3, head;
st_nd st_hd;
double s[ tr] ;
int si[ tr] , si_plus1[ tr] , si_minus1[ tr] ;
double weighti[ tr] , weighti_plus1[ tr] , weighti_minus1[ tr] ;
double aux, d= 0 ;
/*definition cmin and cmax*/
double cmin= 0 , cmax;
switch ( k) {
case 2 :
cmax= 1 ;
break ;
case 3 :
cmax= 3 ;
break ;
case 4 :
cmax= 3 ;
break ;
case 6 :
cmax= 7 ;
break ;
case 8 :
cmax= 15 ;
break ;
default :
}
/* root node and initializing stack */
root = create_node ( 0 , 0 , 0 ) ;
head = root;
init_st( st_hd) ;
printf ( "Root head: m = %lf, s = %d, l = %d\n \n " , head
-> m
, head
-> s
, head
-> l
) ;
//Initializing the cycle
for ( i = tr; i >= 0 ; i-- ) {
int level= i+ 1 ;
printf ( "Level = %d \n " , level
) ; aux= 0 ;
for ( j= i+ 1 ; j<= tr; j++ ) {
printf ( "R[%i][%i] = %lf s[%i] = %lf\n " , i
, j
, R
[ i
] [ j
] , j
, s
[ j
] ) ; aux= R[ i] [ j] * s[ j] + aux;
}
//Calculation of the symbols for each level Si, Si+1 and Si-1
s[ i] = ( y[ i] - aux) / R[ i] [ i] ;
si[ i] = in( s[ i] , cmin, cmax) ;
si_plus1[ i] = si[ i] + 1 ;
si_minus1[ i] = si[ i] - 1 ;
printf ( "s[%d] = %lf, si[%d] = %d, si_plus1[%d] = %d, si_minus1[%d] = %d\n " , i
, s
[ i
] , i
, si
[ i
] , i
, si_plus1
[ i
] , i
, si_minus1
[ i
] ) ;
//Calculation of the accumulated weights for each level Si, Si+1 and Si-1
weighti
[ i
] = fabs ( y
[ i
] - ( R
[ i
] [ i
] * si
[ i
] + aux
) ) + d
; weighti_plus1
[ i
] = fabs ( y
[ i
] - ( R
[ i
] [ i
] * si_plus1
[ i
] + aux
) ) + d
; weighti_minus1
[ i
] = fabs ( y
[ i
] - ( R
[ i
] [ i
] * si_minus1
[ i
] + aux
) ) + d
;
printf ( "wi[%d] = %lf, wi_plus1[%d] = %lf, wi_minus[%d] = %lf\n " , i
, weighti
[ i
] , i
, weighti_plus1
[ i
] , i
, weighti_minus1
[ i
] ) ; //Mimimum weight
d= min_distance( weighti[ i] , weighti_plus1[ i] , weighti_minus1[ i] ) ;
//Adding nodes to the tree
node1= add_node_i ( head, si[ i] , weighti[ i] , i) ;
node2= add_node_i_plus1 ( head, si_plus1[ i] , weighti_plus1[ i] , i) ;
node3= add_node_i_minus1 ( head, si_minus1[ i] , weighti_minus1[ i] , i) ;
printf ( "Node 1: m = %lf, s = %d, l = %d\n " , node1
-> m
, node1
-> s
, node1
-> l
) ; printf ( "Node 2: m = %lf, s = %d, l = %d\n " , node2
-> m
, node2
-> s
, node2
-> l
) ; printf ( "Node 3: m = %lf, s = %d, l = %d\n " , node3
-> m
, node3
-> s
, node3
-> l
) ;
display_tree( root) ;
//push_st(st_hd,node3);
//display(st_hd);
sort_stack( st_hd, node1, node2, node3) ;
head= head_node( node1, node2, node3) ;
sf[ i] = head-> s;
// if(i>0) {pop_st(st_hd,&head);}
}
}
int main ( ) {
int l= 5 , a= 5 , k= 6 , h= t, symbol;
int pt[ t] , i;
double r[ t] [ t] = { { 0.15 , 0.9 , 0.25 , 0.25 , 0.3 } , { 0 , 0.25 , 0.125 , 0.75 , 0.21 } , { 0 , 0 , 0.2 , 0.5 , 0.4 } , { 0 , 0 , 0 , 0.2 , 0.88 } , { 0 , 0 , 0 , 0 , 0.7 } } ;
double y[ t] = { 0.8 , 0.7 , 0.9 , 0.1 , 0.2 } ;
ZZ( y, r, l, a, h, k, pt) ;
for ( i = t- 1 ; i >= 0 ; i-- ) {
symbol= i+ 1 ;
printf ( "simbolo %d=%d\n " , symbol
, pt
[ i
] ) ; }
return 0 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPG1hdGguaD4KCiNkZWZpbmUgdCA1CgovKiBEZWZpbmluZyB0aGUgbm9kZSBzdHJ1Y3R1cmUgKi8KCiAgICBzdHJ1Y3Qgbm9kZXMKICAgIHsKICAgICAgICBkb3VibGUgbTsgLy8gbWV0cmljLy8KICAgICAgICBpbnQgcyxsOyAgLy8gc3ltYm9sIGFuZCBsZXZlbCAgLy8gICAgICAgCiAgICAgICAgc3RydWN0IG5vZGVzICpwdEksICpwdElfcGx1czEsICpwdElfbWludXMxOwogICAgfTsKCnR5cGVkZWYgc3RydWN0IG5vZGVzKiBub2RlOwoKbm9kZSBjcmVhdGVfbm9kZSAoaW50IHN5bWJvbCwgZG91YmxlIHdlaWdodCwgaW50IGxldmVsKXsKCiAgbm9kZSB0ZW1wID0gKG5vZGUpIG1hbGxvYyhzaXplb2Yoc3RydWN0IG5vZGVzKSk7CiAgICBpZiAodGVtcCA9PSBOVUxMKSB7CiAgICAgIGV4aXQoMCk7CiAgICB9IGVsc2UgewogICAgICB0ZW1wLT5zPXN5bWJvbDsKICAgICAgdGVtcC0+bT13ZWlnaHQ7CiAgICAgIHRlbXAtPmw9bGV2ZWw7CiAgICAgIHRlbXAtPnB0SSA9IE5VTEw7CiAgICAgIHRlbXAtPnB0SV9wbHVzMSA9IE5VTEw7CiAgICAgIHRlbXAtPnB0SV9taW51czEgPSBOVUxMOwogICAgICAKICAgICAgLyp3aGlsZSAocHJldi0+bmV4dCAhPSBOVUxMKSB7CiAgICBwcmV2ID0gcHJldi0+bmV4dDsKICAgICAgICB9Ki8KICAgIH0KICAgIHJldHVybiB0ZW1wOwp9Cgpub2RlIGFkZF9ub2RlX2koIG5vZGUgaGQsIGludCBzeW1ib2wsIGRvdWJsZSB3ZWlnaHQsIGludCBsZXZlbCkgewogCiAgICBub2RlIHRlbXA7CiAgICBsZXZlbD1sZXZlbCsxOwogICAgdGVtcCA9IGNyZWF0ZV9ub2RlKHN5bWJvbCwgd2VpZ2h0LCBsZXZlbCk7CiAgICAKICAgIGhkLT5wdEkgPSB0ZW1wOwogICAgCiAgICByZXR1cm4gdGVtcDsgCn0KCm5vZGUgYWRkX25vZGVfaV9wbHVzMSggbm9kZSBoZCwgaW50IHN5bWJvbCwgZG91YmxlIHdlaWdodCwgaW50IGxldmVsKSB7CiAgICBub2RlIHRlbXA7CiAgICBsZXZlbD1sZXZlbCsxOwogICAgdGVtcCA9IGNyZWF0ZV9ub2RlKHN5bWJvbCwgd2VpZ2h0LCBsZXZlbCk7CgogICAgaGQtPnB0SV9wbHVzMSA9IHRlbXA7CiAgICAKICAgIHJldHVybiB0ZW1wOyAKfQoKbm9kZSBhZGRfbm9kZV9pX21pbnVzMSggbm9kZSBoZCwgaW50IHN5bWJvbCwgZG91YmxlIHdlaWdodCwgaW50IGxldmVsKSB7CiAgICBub2RlIHRlbXA7CiAgICBsZXZlbD1sZXZlbCsxOwogICAgdGVtcCA9IGNyZWF0ZV9ub2RlKHN5bWJvbCwgd2VpZ2h0LCBsZXZlbCk7CgogICAgaGQtPnB0SV9taW51czEgPSB0ZW1wOwogICAgCiAgICByZXR1cm4gdGVtcDsgCn0KCgovKiBEZWZpbmluZyB0aGUgc3RhY2sgc3RydWN0dXJlICovCgpzdHJ1Y3Qgc3RhY2tfbm9kZQp7CiAgICBpbnQgZTsKICAgIHN0cnVjdCBzdGFja19ub2RlKiBueHQ7Cn07Cgp0eXBlZGVmIHN0cnVjdCBzdGFja19ub2RlKiBzdF9uZDsKCgovLyBJbml0aWFsaXppbmcgdGhlIHN0YWNrCnZvaWQgaW5pdF9zdChzdF9uZCBzdGFja19oZWFkKQp7CiAgICBwcmludGYoImVsIGNvIGRlIHN1IG1hZHJlXG4iKTsKCiAgICBzdGFja19oZWFkID0gTlVMTDsKfQoKLy8gRW50ZXJpbmcgdGhlIGVsZW1lbnRzIGludG8gc3RhY2sKCnN0X25kIHB1c2hfc3Qoc3RfbmQgc3RhY2tfaGVhZCxpbnQgZGF0YSl7CiAgCiAgc3RfbmQgdG1wID0gKHN0X25kKW1hbGxvYyhzaXplb2Yoc3RydWN0IHN0YWNrX25vZGUpKTsKIAogIGlmKHRtcCA9PSBOVUxMKSB7ZXhpdCgwKTt9CiAgCiAgdG1wLT5lPWRhdGE7CiAgcHJpbnRmKCIlZFxuIix0bXAtPmUpOwogIHRtcC0+bnh0ID0gc3RhY2tfaGVhZDsKCiAgcHJpbnRmKCJ0bXAtPm54dCA9IHN0YWNrX2hlYWQgJWRcbiIsJnN0YWNrX2hlYWQtPmUpOwogIHN0YWNrX2hlYWQgPSB0bXA7ICAgCiAgcHJpbnRmKCIgc3RhY2tfaGVhZD10ZW1wICVkXG4iLCZzdGFja19oZWFkLT5lKTsKICByZXR1cm4gc3RhY2tfaGVhZDsKfQoKLy9EZWxldGluZyBhbiBlbGVtZW50IGZyb20gdGhlIHN0YWNrLgoKc3RfbmQgcG9wX3N0KHN0X25kIHN0YWNrX2hlYWQsaW50ICplbGVtZW50bykKewogICAgc3RfbmQgdG1wID0gc3RhY2tfaGVhZDsKICAgICplbGVtZW50byA9IHN0YWNrX2hlYWQtPmU7CiAgICBzdGFja19oZWFkID0gc3RhY2tfaGVhZC0+bnh0OwogICAgZnJlZSh0bXApOwogICAgcmV0dXJuIHN0YWNrX2hlYWQ7Cn0KCnZvaWQgZGlzcGxheShzdF9uZCBzdGFja19oZWFkKQp7CiAgICBzdF9uZCBjdXJyZW50OwogICAgCiAgICBjdXJyZW50ID0gc3RhY2tfaGVhZDsKICAgIGlmKGN1cnJlbnQhPSBOVUxMKQogICAgewogICAgICAgIHByaW50ZigiU3RhY2s6ICIpOwogICAgICAgIGRvCiAgICAgICAgewogICAgICAgICAgICBwcmludGYoIiBUT1BFIERFTCBTVEFDSyAgc3ltYm9sOiVkICBcbiIsY3VycmVudC0+ZSk7CiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5ueHQ7CiAgICAgICAgfQogICAgICAgIHdoaWxlIChjdXJyZW50IT0gTlVMTCk7CiAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHByaW50ZigiVGhlIFN0YWNrIGlzIGVtcHR5XG4iKTsKICAgIH0KIAp9ICAKCiAKCi8vc29ydCBlbGVtZW50cyBvZiB0aGUgc3RhY2sKCnZvaWQgc29ydF9zdGFjayhzdF9uZCBzdGFja19oZWFkLCBub2RlIG5vZGUxLCBub2RlIG5vZGUyLCBub2RlIG5vZGUzKXsKCiAgIC8vcHJpbnRmKCJvYWFhYWFhYWFhYWFhYWFhXG4iKTsgIAogICAgCiAgICBpZihub2RlMS0+bSA8PSBub2RlMi0+bSAmJiBub2RlMS0+bSA8PSBub2RlMy0+bSl7CiAgICAgICAgCiAgICAgICAgICBpZihub2RlMi0+bSA8PSBub2RlMy0+bSl7CiAgICAgICAgICBwdXNoX3N0KHN0YWNrX2hlYWQsbm9kZTMtPnMpOwogICAgICAgICAgLy9wcmludGYgKCJzaW1ib2xvdG9wZTogJWRcbiIsc3RhY2tfaGVhZC0+ZSk7CiAgICAgICAgICBwdXNoX3N0KHN0YWNrX2hlYWQsbm9kZTItPnMpOwogICAgICAgICAgLy9wcmludGYgKCJzaW1ib2xvdG9wZTogJWRcbiIsc3RhY2tfaGVhZC0+ZSk7CiAgICAgICAgICBwdXNoX3N0KHN0YWNrX2hlYWQsbm9kZTEtPnMpOwogICAgICAgICAgcHJpbnRmICgidXAgdG8gZG93biAxMjNcbiIpOwogICAgICAgICAgLy9wcmludGYoIm9hYWFhYWFhYWFhYWFhYWFcbiIpOwogICAgICAgICAgLy9wcmludGYgKCJzaW1ib2xvdG9wZTogJWRcbiIsc3RhY2tfaGVhZC0+ZSk7CiAgICAgICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICB7cHVzaF9zdChzdGFja19oZWFkLG5vZGUyLT5zKTsKICAgICAgICAgIHB1c2hfc3Qoc3RhY2tfaGVhZCxub2RlMy0+cyk7CiAgICAgICAgICBwdXNoX3N0KHN0YWNrX2hlYWQsbm9kZTEtPnMpOwogICAgICAgICAgcHJpbnRmICgidXAgdG8gZG93biAxMzJcbiIpOwogICAgICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmKG5vZGUyLT5tIDwgbm9kZTEtPm0gJiYgbm9kZTItPm0gPD0gbm9kZTMtPm0pewogICAgICAgCiAgICAgICAgICBpZihub2RlMS0+bSA8PSBub2RlMy0+bSl7CiAgICAgICAgICBwdXNoX3N0KHN0YWNrX2hlYWQsbm9kZTMtPnMpOwogICAgICAgICAgcHVzaF9zdChzdGFja19oZWFkLG5vZGUxLT5zKTsKICAgICAgICAgIHB1c2hfc3Qoc3RhY2tfaGVhZCxub2RlMi0+cyk7CiAgICAgICAgICBwcmludGYgKCJ1cCB0byBkb3duIDIxM1xuIik7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlewogICAgICAgICAgcHVzaF9zdChzdGFja19oZWFkLG5vZGUxLT5zKTsKICAgICAgICAgIHB1c2hfc3Qoc3RhY2tfaGVhZCxub2RlMy0+cyk7CiAgICAgICAgICBwdXNoX3N0KHN0YWNrX2hlYWQsbm9kZTItPnMpOwogICAgICAgICAgcHJpbnRmICgidXAgdG8gZG93biAyMzFcbiIpOwogICAgICAgICAgfSAgIAogICAgfQogICAgZWxzZXsgICAgIAogICAgICAgICAgaWYobm9kZTEtPm0gPD0gbm9kZTItPm0pewogICAgICAgICAgcHVzaF9zdChzdGFja19oZWFkLG5vZGUyLT5zKTsKICAgICAgICAgIHB1c2hfc3Qoc3RhY2tfaGVhZCxub2RlMS0+cyk7CiAgICAgICAgICBwdXNoX3N0KHN0YWNrX2hlYWQsbm9kZTMtPnMpOwogICAgICAgICAgcHJpbnRmICgidXAgdG8gZG93biAzMTJcbiIpOwogICAgICAgICAgcHJpbnRmKCJvYWFhYWFhYWFhYWFhYWFhXG4iKTsKICAgICAgICAgIC8vcHJpbnRmICgic2ltYm9sb3RvcGU6ICVkXG4iLCZzdGFja19oZWFkLT5lKTsKICAgICAgICAgIH1lbHNlewogICAgICAgICAgcHVzaF9zdChzdGFja19oZWFkLG5vZGUxLT5zKTsKICAgICAgICAgIHB1c2hfc3Qoc3RhY2tfaGVhZCxub2RlMi0+cyk7CiAgICAgICAgICBwdXNoX3N0KHN0YWNrX2hlYWQsbm9kZTMtPnMpOwogICAgICAgICAgcHJpbnRmICgidXAgdG8gZG93biAzMjFcbiIpOwogICAgICAgICAgcHJpbnRmKCJvYWFhYWFhYWFhYWFhYWFhXG4iKTsKICAgICAgICAgIC8vcHJpbnRmICgic2ltYm9sb3RvcGU6ICVkXG4iLCZzdGFja19oZWFkLT5lKTsKICAgIH0gCiAgCiAgfQogIAogLy8gcHJpbnRmICgic2ltYm9sb3RvcGU6ICVkXG4iLCZzdGFja19oZWFkLT5lKTsKICAKfQoKCmRvdWJsZSBtaW5fZGlzdGFuY2UoZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgYyl7CiAgZG91YmxlIGRtaW47CiAgaWYoYSA8PSBiICYmIGEgPD0gYyl7CiAgICBkbWluPWE7CiAgfQogIGVsc2UgaWYoYiA8IGEgJiYgYiA8PSBjKXsKICAgIGRtaW49YjsKICB9CiAgZWxzZXsKICAgIGRtaW49YzsKICB9CiAgcmV0dXJuIGRtaW47Cn0KCi8qaW50IHN5bWJvbF9taW5fZGlzdChub2RlIG5vZGUxLCBub2RlIG5vZGUyLCBub2RlIG5vZGUzKXsKICBpbnQgc21pbjsKCiAgaWYobm9kZTEtPm0gPCBub2RlMi0+bSAmJiBub2RlMS0+bSA8IG5vZGUzLT5tKXsKICAgIHNtaW49bm9kZTEtPnM7CiAgfQogIGVsc2UgaWYobm9kZTItPm0gPCBub2RlMS0+bSAmJiBub2RlMi0+bSA8IG5vZGUzLT5tKXsKICAgIHNtaW49bm9kZTItPnM7CiAgfQogIGVsc2V7CiAgICBzbWluPW5vZGUzLT5zOwogIH0KICAKICByZXR1cm4gc21pbjsKfQogKi8gCgpub2RlIGhlYWRfbm9kZShub2RlIG5vZGUxLG5vZGUgbm9kZTIsbm9kZSBub2RlMyl7CiAgbm9kZSB0ZW1wOwogIHRlbXAgPSAobm9kZSkgbWFsbG9jKHNpemVvZihzdHJ1Y3Qgbm9kZXMpKTsKICBpZiAodGVtcCA9PSBOVUxMKSB7CiAgICAgIGV4aXQoMCk7CiAgICB9IAogICAgZWxzZSB7CiAgICBpZihub2RlMS0+bSA8PSBub2RlMi0+bSAmJiBub2RlMS0+bSA8PSBub2RlMy0+bSl7CiAgICB0ZW1wPW5vZGUxOwogICAgfQogICAgZWxzZSBpZihub2RlMi0+bSA8IG5vZGUxLT5tICYmIG5vZGUyLT5tIDw9IG5vZGUzLT5tKXsKICAgIHRlbXA9bm9kZTI7CiAgICB9CiAgICBlbHNlewogICAgdGVtcD1ub2RlMzsKICAgIH0KICAKICBwcmludGYoIk5ldyBoZWFkOiBtID0gJWxmLCBzID0gJWQsIGwgPSAlZFxuIix0ZW1wLT5tLCB0ZW1wLT5zLCB0ZW1wLT5sKTsKICByZXR1cm4gdGVtcDsKfQp9CgppbnQgaW4oZG91YmxlIHUxLGludCBjbWluLGludCBjbWF4KXsgCiAgaW50IHUwOwogIHUwPXJpbnQodTEpOwogIGlmICh1MD5jbWF4KQogICAgIHJldHVybiBjbWF4OwogIGVsc2UKICAgICAge2lmKHUwPGNtaW4pCiAgICAgICAgICAgcmV0dXJuIGNtaW47CiAgICAgICBlbHNlCiAgICAgICAgICAgcmV0dXJuIHUwOwogICAgICB9Cn0KCnZvaWQgZGlzcGxheV90cmVlIChub2RlIGhlYWQpeyAKICAgICAgaWYgKGhlYWQgIT0gTlVMTCkKICAgIHsgCiAgICAgIHByaW50ZigibSA9ICVsZiwgcyA9ICVkLCBsID0gJWRcbiIsIGhlYWQtPm0sIGhlYWQtPnMsaGVhZC0+bCk7CiAgICAgIGRpc3BsYXlfdHJlZShoZWFkLT5wdEkpOwogICAgICBkaXNwbGF5X3RyZWUoaGVhZC0+cHRJX3BsdXMxKTsKICAgICAgZGlzcGxheV90cmVlKGhlYWQtPnB0SV9taW51czEpOwogICAgfSAKfQoKLy9aaWcgWmFnIGRlY29kZXIgYWxnb3JpdGhtCnZvaWQgIFpaKGRvdWJsZSAqeSxkb3VibGUgUlt0XVt0XSxpbnQgbGcsaW50IGNvbCwgaW50IHRyLCBpbnQgaywgaW50KiBzZil7CgovL2xvY2FsIHZhcmlhYmxlcyAgCiAgaW50IGksajsgCiAgdHI9dHItMTsgICAvL01hdHJpeCBpbmRleAogIG5vZGUgcm9vdCxub2RlMSxub2RlMixub2RlMyxoZWFkOwogIHN0X25kIHN0X2hkOwogIGRvdWJsZSBzW3RyXTsKICBpbnQgc2lbdHJdLHNpX3BsdXMxW3RyXSxzaV9taW51czFbdHJdOwogIGRvdWJsZSB3ZWlnaHRpW3RyXSx3ZWlnaHRpX3BsdXMxW3RyXSx3ZWlnaHRpX21pbnVzMVt0cl07CiAgZG91YmxlIGF1eCxkPTA7CgogICAgIAogICAvKmRlZmluaXRpb24gY21pbiBhbmQgY21heCovCiAgICBkb3VibGUgY21pbj0wLGNtYXg7CiAgICBzd2l0Y2ggKGspewogICAgICBjYXNlIDI6CiAgICAgICAgY21heD0xOwogICAgICBicmVhazsKICAgICAgY2FzZSAzOgogICAgICAgIGNtYXg9MzsKICAgICAgYnJlYWs7CiAgICAgIGNhc2UgNDoKICAgICAgICBjbWF4PTM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIDY6CiAgICAgICAgY21heD03OwogICAgICBicmVhazsKICAgICAgY2FzZSA4OgogICAgICAgIGNtYXg9MTU7CiAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICBwcmludGYoImluY29ycmVjdCBrXG4iKTsKICAgIH0KICAKICAKICAvKiByb290IG5vZGUgYW5kIGluaXRpYWxpemluZyBzdGFjayAqLwogIHJvb3QgPSBjcmVhdGVfbm9kZSAoMCwwLDApOwogIGhlYWQgPSByb290OwogIGluaXRfc3Qoc3RfaGQpOwogIHByaW50ZigiUm9vdCBoZWFkOiBtID0gJWxmLCBzID0gJWQsIGwgPSAlZFxuXG4iLGhlYWQtPm0sIGhlYWQtPnMsIGhlYWQtPmwpOwoKLy9Jbml0aWFsaXppbmcgdGhlIGN5Y2xlCiAgZm9yKGkgPSB0cjtpID49MCA7aS0tKXsKICAgIGludCBsZXZlbD1pKzE7CiAgICBwcmludGYoIkxldmVsID0gJWQgXG4iLGxldmVsKTsgICAKICAgIGF1eD0wOwoKICAgICAgZm9yKGo9aSsxO2o8PXRyO2orKyl7CiAgICAgICAgcHJpbnRmKCJSWyVpXVslaV0gPSAlbGYgIHNbJWldID0gJWxmXG4iLCBpLGosUltpXVtqXSwgaixzW2pdKTsKICAgICAgICBhdXg9UltpXVtqXSpzW2pdK2F1eDsKICAgICAgfQogICAgICAgIC8vQ2FsY3VsYXRpb24gb2YgdGhlIHN5bWJvbHMgZm9yIGVhY2ggbGV2ZWwgU2ksIFNpKzEgYW5kIFNpLTEKICAgICAgICBwcmludGYoImF1eCA9ICVsZlxuIiwgYXV4KTsKICAgICAgICBzW2ldPSh5W2ldLWF1eCkvUltpXVtpXTsKICAgICAgICBzaVtpXT1pbihzW2ldLGNtaW4sY21heCk7CiAgICAgICAgc2lfcGx1czFbaV09c2lbaV0rMTsKICAgICAgICBzaV9taW51czFbaV09c2lbaV0tMTsKCiAgICAgICAgcHJpbnRmKCJzWyVkXSA9ICVsZiwgc2lbJWRdID0gJWQsIHNpX3BsdXMxWyVkXSA9ICVkLCBzaV9taW51czFbJWRdID0gJWRcbiIsIGksIHNbaV0sIGksIHNpW2ldLCBpLHNpX3BsdXMxW2ldLGksc2lfbWludXMxW2ldKTsKCiAgICAgICAgLy9DYWxjdWxhdGlvbiBvZiB0aGUgYWNjdW11bGF0ZWQgd2VpZ2h0cyBmb3IgZWFjaCBsZXZlbCBTaSwgU2krMSBhbmQgU2ktMQogICAgICAgIHdlaWdodGlbaV09ZmFicyh5W2ldLShSW2ldW2ldKnNpW2ldK2F1eCkpK2Q7CiAgICAgICAgd2VpZ2h0aV9wbHVzMVtpXT1mYWJzKHlbaV0tKFJbaV1baV0qc2lfcGx1czFbaV0rYXV4KSkrZDsKICAgICAgICB3ZWlnaHRpX21pbnVzMVtpXT1mYWJzKHlbaV0tKFJbaV1baV0qc2lfbWludXMxW2ldK2F1eCkpK2Q7CgogICAgICAgIHByaW50Zigid2lbJWRdID0gJWxmLCB3aV9wbHVzMVslZF0gPSAlbGYsIHdpX21pbnVzWyVkXSA9ICVsZlxuIixpLHdlaWdodGlbaV0sIGkgLCB3ZWlnaHRpX3BsdXMxW2ldLCBpLCB3ZWlnaHRpX21pbnVzMVtpXSk7CiAgICAgICAgLy9NaW1pbXVtIHdlaWdodAogICAgICAgIGQ9bWluX2Rpc3RhbmNlKHdlaWdodGlbaV0sIHdlaWdodGlfcGx1czFbaV0sIHdlaWdodGlfbWludXMxW2ldKTsKCiAgICAgICAgcHJpbnRmKCJkIG1pbiA9ICVsZlxuIixkKTsKCiAgICAgICAgLy9BZGRpbmcgbm9kZXMgdG8gdGhlIHRyZWUKICAgICAgICBub2RlMT0gYWRkX25vZGVfaSAoaGVhZCwgc2lbaV0sd2VpZ2h0aVtpXSxpKTsKICAgICAgICBub2RlMj1hZGRfbm9kZV9pX3BsdXMxIChoZWFkLHNpX3BsdXMxW2ldLHdlaWdodGlfcGx1czFbaV0saSk7CiAgICAgICAgbm9kZTM9YWRkX25vZGVfaV9taW51czEgKGhlYWQsc2lfbWludXMxW2ldLHdlaWdodGlfbWludXMxW2ldLGkpOwoKICAgICAgICBwcmludGYoIk5vZGUgMTogbSA9ICVsZiwgcyA9ICVkLCBsID0gJWRcbiIsIG5vZGUxLT5tLCBub2RlMS0+cywgbm9kZTEtPmwpOwogICAgICAgIHByaW50ZigiTm9kZSAyOiBtID0gJWxmLCBzID0gJWQsIGwgPSAlZFxuIiwgbm9kZTItPm0sIG5vZGUyLT5zLCBub2RlMi0+bCk7CiAgICAgICAgcHJpbnRmKCJOb2RlIDM6IG0gPSAlbGYsIHMgPSAlZCwgbCA9ICVkXG4iLCBub2RlMy0+bSwgbm9kZTMtPnMsIG5vZGUzLT5sKTsKICAgICAgICAKICAgICAgICBwcmludGYgKCJUUkVFOlxuIik7CiAgICAgICAgZGlzcGxheV90cmVlKHJvb3QpOwoKICAgICAgICAvL3B1c2hfc3Qoc3RfaGQsbm9kZTMpOwoKICAgICAgICAvL2Rpc3BsYXkoc3RfaGQpOwogICAgICAgIHNvcnRfc3RhY2soc3RfaGQsbm9kZTEsIG5vZGUyLCBub2RlMyk7CiAgICAgICAgaGVhZD1oZWFkX25vZGUobm9kZTEsbm9kZTIsbm9kZTMpOwoKICAgIHNmW2ldID0gaGVhZC0+czsgCiAgIC8vIGlmKGk+MCkge3BvcF9zdChzdF9oZCwmaGVhZCk7fQoKICBwcmludGYoIlxuXG4iKTsgCiAgfQp9CgppbnQgbWFpbiAoKXsKCiAgaW50IGw9NSwgYT01LGs9NiwgaD10LCBzeW1ib2w7CiAgaW50IHB0W3RdLGk7CiAgZG91YmxlIHJbdF1bdF09e3swLjE1LDAuOSwwLjI1LDAuMjUsMC4zfSx7MCwwLjI1LDAuMTI1LDAuNzUsMC4yMX0sezAsMCwwLjIsMC41LDAuNH0sezAsMCwwLDAuMiwwLjg4fSx7MCwwLDAsMCwwLjd9fTsKICBkb3VibGUgeVt0XT17MC44LDAuNywwLjksMC4xLDAuMn07CiAgCgogIFpaKHkscixsLGEsIGgsIGsscHQpOwoKICBmb3IgKCBpID0gdC0xOyBpID49IDA7IGktLSApIHsKICBzeW1ib2w9aSsxOwogIHByaW50ZiggInNpbWJvbG8gJWQ9JWRcbiIsc3ltYm9sLHB0W2ldKTsKICB9CgogICByZXR1cm4gMDsKfQo=
stdout
el co de su madre
Root head: m = 0.000000, s = 0, l = 0
Level = 5
aux = 0.000000
s[4] = 0.285714, si[4] = 0, si_plus1[4] = 1, si_minus1[4] = -1
wi[4] = 0.200000, wi_plus1[4] = 0.500000, wi_minus[4] = 0.900000
d min = 0.200000
Node 1: m = 0.200000, s = 0, l = 5
Node 2: m = 0.500000, s = 1, l = 5
Node 3: m = 0.900000, s = -1, l = 5
TREE:
m = 0.000000, s = 0, l = 0
m = 0.200000, s = 0, l = 5
m = 0.500000, s = 1, l = 5
m = 0.900000, s = -1, l = 5
-1
tmp->nxt = stack_head 0
stack_head=temp 1044476128
1
tmp->nxt = stack_head 0
stack_head=temp 1044476160
0
tmp->nxt = stack_head 0
stack_head=temp 1044476192
up to down 123
New head: m = 0.200000, s = 0, l = 5
Level = 4
R[3][4] = 0.880000 s[4] = 0.285714
aux = 0.251429
s[3] = -0.757143, si[3] = 0, si_plus1[3] = 1, si_minus1[3] = -1
wi[3] = 0.351429, wi_plus1[3] = 0.551429, wi_minus[3] = 0.248571
d min = 0.248571
Node 1: m = 0.351429, s = 0, l = 4
Node 2: m = 0.551429, s = 1, l = 4
Node 3: m = 0.248571, s = -1, l = 4
TREE:
m = 0.000000, s = 0, l = 0
m = 0.200000, s = 0, l = 5
m = 0.351429, s = 0, l = 4
m = 0.551429, s = 1, l = 4
m = 0.248571, s = -1, l = 4
m = 0.500000, s = 1, l = 5
m = 0.900000, s = -1, l = 5
1
tmp->nxt = stack_head 0
stack_head=temp 1044476416
0
tmp->nxt = stack_head 0
stack_head=temp 1044476448
-1
tmp->nxt = stack_head 0
stack_head=temp 1044476480
up to down 312
oaaaaaaaaaaaaaaa
New head: m = 0.248571, s = -1, l = 4
Level = 3
R[2][3] = 0.500000 s[3] = -0.757143
R[2][4] = 0.400000 s[4] = 0.285714
aux = -0.264286
s[2] = 5.821429, si[2] = 6, si_plus1[2] = 7, si_minus1[2] = 5
wi[2] = 0.284286, wi_plus1[2] = 0.484286, wi_minus[2] = 0.412857
d min = 0.284286
Node 1: m = 0.284286, s = 6, l = 3
Node 2: m = 0.484286, s = 7, l = 3
Node 3: m = 0.412857, s = 5, l = 3
TREE:
m = 0.000000, s = 0, l = 0
m = 0.200000, s = 0, l = 5
m = 0.351429, s = 0, l = 4
m = 0.551429, s = 1, l = 4
m = 0.248571, s = -1, l = 4
m = 0.284286, s = 6, l = 3
m = 0.484286, s = 7, l = 3
m = 0.412857, s = 5, l = 3
m = 0.500000, s = 1, l = 5
m = 0.900000, s = -1, l = 5
7
tmp->nxt = stack_head 0
stack_head=temp 1044476704
5
tmp->nxt = stack_head 0
stack_head=temp 1044476736
6
tmp->nxt = stack_head 0
stack_head=temp 1044476768
up to down 132
New head: m = 0.284286, s = 6, l = 3
Level = 2
R[1][2] = 0.125000 s[2] = 5.821429
R[1][3] = 0.750000 s[3] = -0.757143
R[1][4] = 0.210000 s[4] = 0.285714
aux = 0.219821
s[1] = 1.920714, si[1] = 2, si_plus1[1] = 3, si_minus1[1] = 1
wi[1] = 0.304107, wi_plus1[1] = 0.554107, wi_minus[1] = 0.514464
d min = 0.304107
Node 1: m = 0.304107, s = 2, l = 2
Node 2: m = 0.554107, s = 3, l = 2
Node 3: m = 0.514464, s = 1, l = 2
TREE:
m = 0.000000, s = 0, l = 0
m = 0.200000, s = 0, l = 5
m = 0.351429, s = 0, l = 4
m = 0.551429, s = 1, l = 4
m = 0.248571, s = -1, l = 4
m = 0.284286, s = 6, l = 3
m = 0.304107, s = 2, l = 2
m = 0.554107, s = 3, l = 2
m = 0.514464, s = 1, l = 2
m = 0.484286, s = 7, l = 3
m = 0.412857, s = 5, l = 3
m = 0.500000, s = 1, l = 5
m = 0.900000, s = -1, l = 5
3
tmp->nxt = stack_head 0
stack_head=temp 1044476992
1
tmp->nxt = stack_head 0
stack_head=temp 1044477024
2
tmp->nxt = stack_head 0
stack_head=temp 1044477056
up to down 132
New head: m = 0.304107, s = 2, l = 2
Level = 1
R[0][1] = 0.900000 s[1] = 1.920714
R[0][2] = 0.250000 s[2] = 5.821429
R[0][3] = 0.250000 s[3] = -0.757143
R[0][4] = 0.300000 s[4] = 0.285714
aux = 3.080429
s[0] = -15.202857, si[0] = 0, si_plus1[0] = 1, si_minus1[0] = -1
wi[0] = 2.584536, wi_plus1[0] = 2.734536, wi_minus[0] = 2.434536
d min = 2.434536
Node 1: m = 2.584536, s = 0, l = 1
Node 2: m = 2.734536, s = 1, l = 1
Node 3: m = 2.434536, s = -1, l = 1
TREE:
m = 0.000000, s = 0, l = 0
m = 0.200000, s = 0, l = 5
m = 0.351429, s = 0, l = 4
m = 0.551429, s = 1, l = 4
m = 0.248571, s = -1, l = 4
m = 0.284286, s = 6, l = 3
m = 0.304107, s = 2, l = 2
m = 2.584536, s = 0, l = 1
m = 2.734536, s = 1, l = 1
m = 2.434536, s = -1, l = 1
m = 0.554107, s = 3, l = 2
m = 0.514464, s = 1, l = 2
m = 0.484286, s = 7, l = 3
m = 0.412857, s = 5, l = 3
m = 0.500000, s = 1, l = 5
m = 0.900000, s = -1, l = 5
1
tmp->nxt = stack_head 0
stack_head=temp 1044477280
0
tmp->nxt = stack_head 0
stack_head=temp 1044477312
-1
tmp->nxt = stack_head 0
stack_head=temp 1044477344
up to down 312
oaaaaaaaaaaaaaaa
New head: m = 2.434536, s = -1, l = 1
simbolo 5=0
simbolo 4=-1
simbolo 3=6
simbolo 2=2
simbolo 1=-1