
                             Nuevo Dakar
                             ===========


Ahora que el famoso rally Dakar ya no se celebra en Africa sino en Sudamrica,
los senegaleses organizan unas carreras motociclistas ms modestas pero que
(stas s) acaban realmente en Dakar.  Consideremos una de estas carreras, que
usa una determinada red de pistas que parten de 2^n poblados (siendo n>=1).
Estas pistas van confluyendo (dos a dos) dando lugar a una curiosa estructura
de rbol binario que acaba en un nico tramo final en las playas de Dakar,
donde se encuentra la meta. En cada confluencia de dos pistas existe una
Estacin de Servicio (o gasolinera) de la cual conocemos la cantidad de
gasolina en centilitros que tiene disponible para toda la carrera y la
distancia en kilmetros que la separa de la siguiente estacion de servicio o de
la meta si es la ltima; ambos valores sern naturales. Por ejemplo, si n es 3
entonces la estructura es


                                   Dakar
                                     |
                                     |
                                    ES0
                                /         \
                               /           \
                              /             \
                            ES1             ES2
                          /    \           /    \
                         /      \         /      \ 
                       ES3      ES4      ES5     ES6
                      /  \      / \      / \     / \
                     /    \    /   \    /   \   /   \
                    P1    P2  P3   P4  P5   P6 P7   P8 


donde P1 ... P8 son los poblados de partida y ES0 ... ES6 son estaciones de
servicio, siendo ES0 la ltima antes del tramo final en Dakar.  Los poblados se
pueden considerar del mismo tipo que las estaciones de servicio (distancia +
gasolina), porque en ellos tendremos la distancia a la siguiente estacion de
servicio, pero la gasolina no ser relevante.  De ese modo, poblados y
estaciones de servicio pueden formar parte del mismo rbol que representa el
recorrido de la carrera.

Existen dos modos de carrera: colectivo e individual.  En una carrera en modo
colectivo, a la misma hora sale de cada poblado un motorista con el depsito de
su moto lleno y con la intencin de llegar a Dakar. En una carrera en modo
individual participa un nico motorista, que sale de un poblado determinado,
tambin con el depsito lleno, para realizar su recorrido hasta Dakar en
solitario.

Se seguir la siguiente poltica de repostaje para optimizar recursos: al
llegar una moto a una estacin de servicio, se calcular si la gasolina que
tendra la moto despus de repostar en ella lo mximo que pueda es o no
suficiente para llegar a la siguiente estacin (o a la meta, en el caso de la
ltima estacin). Si no es suficiente, entonces no se procede al repostaje y el
participante queda eliminado. En caso contrario, el gasolinero pone gasolina
hasta llenar el depsito, siempre y cuando le quede suficiente; en otro caso
pone toda la que le queda.  Adems, como es usual, en estas gasolineras se
sirve por estricto orden de llegada (en el caso de que dos motoristas lleguen
al mismo tiempo se sirve primero al que ha gastado menos gasolina desde que
empez y si an persiste el empate al de identificador ms pequeo).

Los identificadores de los participantes (y de sus motos) estn asociados al
poblado del cual parten inicialmente. Una posibilidad de definir dicha
asociacin es la siguiente:

En primer lugar, numeramos los poblados (entre 1 y 2^n) asi:

- la raz del arbol (ES0) recibe el valor cero; 

- cada nodo transmite el doble de su valor a su hijo izquierdo y a su hijo
  derecho el doble ms uno.

Entonces, cada poblado recibe un nmero distinto en el intervalo [0..(2^n)-1]
al cual hay que sumar uno.  As, podemos asociar al poblado i-simo la moto
i-sima, siendo 1<=i<=2^n (ntese que esta numeracin es simplemente la de
izquierda a derecha).

De las motos sabemos: su velocidad (en centmetros por segundo), su consumo (en
centilitros a los 100km) y la capacidad de su depsito (en centilitros), la
cual coincide con el combustible disponible inicialmente en la salida.  Por
motivos de simplificacin en los clculos numricos (y en la comprobacin
automtica de su correccin) supondremos que estas tres cantidades son
constantes de tipo natural y que todos los clculos del tiempo y de la gasolina
consumida se realizan con aritmtica entera, usando como unidades el segundo y
el centilitro, respectivamente.

Nuestro objetivo principal es simular cada una de las carreras, tanto en modo
colectivo como en modo individual, teniendo en cuenta que entre dos carreras
consecutivas podremos cambiar las caractersticas del recorrido y/o las
caractersticas de las motos.  Supondremos que al inicio de cada carrera cada
estacin de servicio vuelve a disponer de la gasolina indicada en el ltimo
recorrido ledo.

En concreto, nos interesa conocer, como resultado de la carrera en modo
colectivo, la clasificacin por orden de llegada a Dakar de los participantes
que consiguen completar el recorrido, listando para cada motorista su
identificador (entero entre 1 y 2^n), el tiempo total invertido (en segundos),
la gasolina total gastada (en centilitros) y la gasolina con la que llega
(tambin en centilitros). Los criterios de desempate sern los mismos que los
especificados antes para la llegada a las estaciones de servicio.

Tened en cuenta que el orden de llegada, tanto a la meta como a cualquier
estacin de servicio, depende de la velocidad de las motos y de la longitud del
trayecto recorrido (no slo desde la anterior estacin de servicio).  Adems,
la capacidad del depsito de las motos y de las gasolineras, junto con el orden
de repostaje en las mismas y las longitudes de los tramos, determinarn qu
participantes quedan eliminados por insuficiencia de combustible antes de
llegar a la meta (ninguno, alguno/s o todos).

En el caso de las carreras en modo individual, nos interesa conocer si el nico
motorista participante ha conseguido llegar a la meta, y si es as, el tiempo
total invertido, la gasolina total gastada y la gasolina con la que llega, en
las mismas unidades mencionadas antes.

Finalmente, con los resultados de las carreras en modo colectivo se confecciona
un ranking de los motoristas.  Para ello, los k primeros de cada carrera
reciben puntos segn el orden de llegada a Dakar: k puntos el primero, (k-1) el
segundo, y as hasta 1 punto para el k-simo. Si llegan menos de k motoristas
slo reciben puntos los que llegan.


SE PIDE:
=======

Disear un programa modular razonablemente eficiente que permita modelar los
recorridos de las carreras, representar las caractersticas de las motos de los
participantes y simular las carreras para obtener y escribir las
clasificaciones. En primer lugar, debe leer el nmero n y el nmero k, que
sern fijos en la misma ejecucin del programa. Luego debe leer la estructura
del primer recorrido con los datos de las estaciones y de los 2^n
poblados. Seguidamente debe leer los datos de las motos iniciales de los 2^n
participantes. Despus, tras inicializar el ranking, tendr que ir procesando
las diversas tareas que se le pidan. Estas podrn ser las siguientes:

1) Realizar una carrera en modo colectivo con el recorrido y participantes
actuales, obteniendo y escribiendo la clasificacin final de la misma, y
actualizando el ranking. La clasificacin de la carrera se escribe por orden de
llegada a la meta de los participantes que consiguen completar el recorrido,
listando para cada uno su identificador (entero entre 1 y 2^n), el tiempo total
invertido (en segundos), la gasolina total gastada (en centilitros) y la
gasolina con la que llega (tambin en centilitros).  Se aplican los criterios
de desempate antes expuestos.

2) Realizar una carrera en modo individual con el recorrido actual, despus de
leer el identificador del participante, partiendo del poblado que tiene
asociado y usando los datos de su moto actual.  En este caso se debe escribir
si llega o no a la meta, y en caso afirmativo, el tiempo invertido, la gasolina
gastada y la gasolina con la que llega.

3) Substituir el recorrido actual por uno nuevo, volviendo a leer los datos de
estaciones y poblados, pero manteniendo el nmero de stos: 2^n poblados (n no
cambia).

4) Substituir las motos actuales de los participantes por unas nuevas, leyendo
sus caractersticas. En total se leern los datos de 2^n motos.
  
5) Escribir el ranking ordenado descendentemente por puntos de todos los
participantes, indicando el identificador y los puntos de cada uno.  En caso de
empate a puntos, se lista primero el de identificador ms pequeo.

La forma de comunicarnos con el programa para que realice dichas tareas ser
parecida a la del caso de estudio "Cubeta" que se ve en la sesin 8 de
laboratorio. Podis disear un esquema provisional que ya refinaris cuando
conozcis el juego de pruebas pblico.

En das sucesivos se completarn los detalles que se hayan podido pasar por
alto en este enunciado y se publicarn las aclaraciones oportunas.

La sintaxis *exacta* de los datos y resultados, acompaada del juego de pruebas
pblico, se conocer dos semanas antes del da del examen de la prctica.
Hasta entonces no podris implementar de forma definitiva las operaciones de
lectura y escritura necesarias para los tipos que utilicis, aunque s podris
especificarlas.

