			AGENDA DE UNA ADMINISTRACIN


  El "Daijo-kan" (Gran Consejo de Estado) era el encargado de dirigir la 
  Aministracin de Japn durante las eras Nara (710-794) y Heian (794-1185).
  Estaba presidido por el "Daijo Daijin" (Primer Ministro). Debajo de l 
  estaban el "Sadaijin" (Ministro de la Izquierda) y el "Udaijin" (Ministro
  de la Derecha). De stos dependa el resto de niveles de la Administracin.
  
                                           Historia de Japn, varias fuentes


Supongamos que la Administracin de un territorio determinado dispone de N
funcionarios en total, identificados con los valores enteros 1..N (N>0).  Su
organigrama funcionarial se organiza de manera jerrquica, de forma que cada
funcionario tiene una posicin bien definida dentro del mismo, pero no existe
necesariamente una correspondencia entre su identificador y su posicin.

Dicho organigrama est presidido por una nica persona, denominada "Superjefe".
ste trabaja directamente con un mximo de dos funcionarios "subalternos".  A
su vez, cada uno de stos puede disponer como mximo de otros dos subalternos y
as sucesivamente. Los subalternos de un funcionario se refieren a ste
simplemente como "jefe" y se distinguen entre s mediante los calificativos
"izquierdo" y "derecho".  Siempre que un funcionario slo tenga un subalterno,
se interpreta que se trata de su subalterno izquierdo.

Un mismo funcionario solo puede tener un jefe y el nico que no tiene jefe es
el Superjefe.  Para poder comparar las posiciones de los funcionarios en la
jerarqua, convenimos que el Superjefe es un funcionario de nivel 0, sus
subalternos son funcionarios de nivel 1, los subalternos de stos son
funcionarios de nivel 2, etc. Diremos que los "descendientes" de un funcionario
son sus subalternos, los subalternos de stos y as sucesivamente hasta los
niveles ocupados por funcionarios que no tengan ningn subalterno, a los que
denominamos "becarios".

Consideremos la siguiente Administracin formada por 10 funcionarios: los
nmeros indican los identificadores de los mismos y las lneas indican las
relaciones jerrquicas entre ellos.  
                    
                           3
                       /       \
                     9           10
                   /   \       /                
                  5     4     8
                 / \         / \
                1   2       6   7


Algunos ejemplos concretos de los conceptos que acabamos de introducir son:

* el funcionario 3 es el Superjefe, el 9 y el 10 son sus subalternos 

* el 9 es el jefe del 4, el 8 lo es del 6, etc.
            
* el nivel 2 est formado por el 5, el 4 y el 8

* el 6, el 7 y el 8 son los descendientes del 10


El programa deber mantener una agenda con las citas de los funcionarios.
Durante toda la vida de la agenda, sta trabajar con un tiempo interno medido
en das. El primer da de funcionamiento ser el da 1, el siguiente el 2, etc.

Cada funcionario dispone exactamente de H (entero mayor que 0) horas al da
para atender citas y para cada cita se reserva exactamente una hora. En la
agenda solo aparecern las H horas de cada da que han de dedicarse a atender
citas.  La distribucin de dichas horas es la misma para todos los funcionarios
todos los das.

Concertar una cita significa asignarle un identificador entero mayor que 0, un
da, una hora reservada (entero entre 1 y H) y un funcionario.  Podremos hablar
de la cita <312, 567, 3, 9> (la cita 312 ha sido concertada para el da 567,
tercera hora y asignada al funcionario 9), de la cita <1923, 34, 7, 1019>, etc.

A continuacin presentamos todas las funcionalidades del programa.  


Citas nuevas
============

La agenda permitir registrar peticiones de citas nuevas en cualquier momento.
Las peticiones registradas un da determinado solo podrn dar lugar a citas
concertadas en alguno de los D (entero mayor que 0) das siguientes. Por
ejemplo, si la agenda es de 30 das (D=30) y la primera peticin de la vida del
programa se registra el da 1, la cita solo podr concertarse entre los das 2
y 31. Si la agenda es de 90 das (D=90) y una peticin se registra el da 178,
la cita solo podr concertarse entre los das 179 y 268 del sistema.

Cuando un ciudadano necesite pedir una cita, se pondrn a su disposicin dos
modelos de peticin. Usar el primero si prefiere que su cita tenga lugar en un
dia determinado (prioridad por da) y que el sistema determine el menor nivel
posible del funcionario; usar el segundo si prefiere que su cita se realice
con un funcionario de un nivel menor o igual a un valor determinado (prioridad
por nivel) y que el sistema determine el mejor da posible. Recordemos que, en
nuestro contexto, menor nivel de funcionario significa mayor poder.

Las peticiones han de incluir los siguientes datos:

- da en que el ciudadano registra la peticin

- modelo de peticin que desea utilizar

- datos necesarios para el modelo elegido

Ntese que una vez registrada y concertada una cita, sta tendr asociados dos
das: el de su registro y el previsto para su realizacin. Como hemos dicho,
habr casos en que el da de realizacin no conste en la peticin, sino que el
ciudadano dejar que sea fijado por el propio sistema. Ms adelante veremos que
tambin habr mecanismos para modificar algunos datos de una cita, entre ellos
el da de realizacin.

Dependiendo del modelo de peticin, los datos que se le pedirn al ciudadano 
y los criterios de asignacin sern diferentes. Los mostramos a continuacin:

1) prioridad por da: el ciudadano proporciona su da y hora preferidos para la
cita; se le asignar el funcionario de menor nivel que est libre en ese
momento; si no hay ninguno se repite el proceso el siguiente da a la misma
hora y as sucesivamente.

2) prioridad por nivel: el ciudadano proporciona su hora preferida y un valor
entero no negativo n; la cita se concertar el primer da posterior al del
registro de la peticin en el que exista al menos un funcionario libre a esa
hora, que sea de nivel menor o igual que n; se asignar el funcionario de
menor nivel entre ellos.

En ambos criterios, si existen varios funcionarios asignables del mismo nivel
se toma el de ms a la izquierda.

Si no es posible encontrar das, horas o funcionarios que cumplan el criterio
asociado al modelo de peticin elegido (dentro de los D das siguientes al de
la solicitud) la cita se considera irrealizable y no tendr repercusin en la
agenda.

Si la cita se puede concertar, el sistema le asigna automticamente un
identificador.  El identificador de la primera cita concertada en el sistema
ser el 1. El resto de identificadores se asigna correlativamente segn el
orden cronolgico de registro: la segunda cita concertada tendr el
identificador 2, la tercera el 3, etc.


Das y horas libres: reasignacin de citas 
==========================================

Un funcionario podr pedir (slo para s mismo, no para otros funcionarios)
das u horas libres en cualquier momento. Tendr a su disposicin dos modelos
de peticin, segn si desea un intervalo de das completos libres o solo una
hora suelta (si quiere varias horas sueltas libres, tendr que realizar otras
tantas peticiones).

1) Intervalo de das libres: la peticin ha de incluir los siguientes datos:
   identificador del funcionario, da de registro de la peticin de das
   libres, primer da del intervalo, ltimo da del intervalo. El primer da
   del intervalo ha de ser posterior al da del registro. El ltimo da del
   intervalo ha de ser el mismo o posterior al primero.

   Si el funcionario tiene citas en alguna hora de los das del intervalo
   especificado en la peticin, sta se rechaza y no tiene ningn efecto sobre
   la agenda; en caso contrario, todas las horas de dichos das se marcan como
   no hbiles para el funcionario respecto a futuras citas, salvo los que
   sobrepasen los D das posteriores al del registro de la peticin, que no se
   ven afectados de ninguna manera. Si dentro del intervalo hay das (u horas
   sueltas) ya marcados como no hbiles, stos siguen siendo no hbiles.

2) Anulacin de una hora suelta: la peticin ha de incluir los siguientes
   datos: identificador del funcionario, da de registro de la peticin de
   anulacin, da y hora que se quieren anular. El da de la anulacin ha de
   ser posterior al da del registro. La anulacin siempre se realiza, salvo si
   su da sobrepasa los D das posteriores al del registro de la peticin o si
   la misma hora del mismo da ya ha sido anulada anteriormente, en cuyo caso
   la anulacin no tiene ningn efecto.

   Tanto si el funcionario tiene una cita concertada en ese da y hora, como
   si no, dicho par <da, hora> se marca como no hbil para futuras citas.

   Adems, si el funcionario (llammoslo f) tiene una cita a esa hora, se
   determina cul es el descendiente (llammoslo d) ms cercano a f que est
   libre ese da y esa hora.  En caso de haber varios candidatos a la misma
   distancia, se elige el de ms a la izquierda.  Entonces la cita de f se le
   asigna al subalterno (llammoslo s) de f en direccin a d; la de s a su
   propio subalterno en direccin a d y as sucesivamente, de forma que d se
   queda con la cita original de su jefe y el proceso termina.

   Los descendientes de f con la hora marcada como no hbil no intervienen en
   este proceso de reasignacin de citas (la cita que le tocara a cada uno de
   ellos ha de transmitirse al subalterno que corresponda en cada caso) pero s
   han de tenerse en cuenta para el clculo del descendiente libre ms cercano
   a f.

   Si f no tiene ningn descendiente libre, su cita se reasigna a partir del
   da siguiente al da en el que la cita iba a tener lugar originalmente, con
   los mismos criterios que las citas nuevas, manteniendo el identificador, la
   hora, el modelo de peticin (y el nivel, si el modelo lo requiere) de la
   peticin original de dicha cita.
 

Consulta de citas ya realizadas
===============================

El rendimiento de los funcionarios de la Administracin se evala en periodos
de K das (K>0). El programa admitir peticiones de consultas basadas en dicho
valor. Cada peticin requiere como dato el da en la que es registrada, que ha
de ser mayor que 1 y producir el listado de todas las citas atendidas en los K
das anteriores al da de registro de la peticin, ordenadas cronolgicamente
por da. Si el da de registro es menor o igual que K, se escriben las citas de
todos los das anteriores.  Para cada da, las citas se escriben por orden
creciente de identificador de funcionario. Para cada funcionario, han de
aparecer ordenadas cronolgicamente por hora.  Para cada cita han de escribirse
estos tres valores, ms el identificador de la cita.



Consulta de citas "vivas"
=========================

Cada peticin de consulta requiere como dato el da en la que es registrada.
El programa ha de escribir todas las citas concertadas hasta el momento de la
consulta para los D das siguientes al da de registro, ordenadas
cronolgicamente por da.  Para cada da, las citas se escriben por orden
creciente de identificador de funcionario. Para cada funcionario, han de
aparecer ordenadas cronolgicamente por hora. Para cada cita han de escribirse
estos tres valores, ms el identificador de la cita.


Paso de los das
================

Supondremos que el programa recibir las peticiones de citas, anulaciones, y
consultas en orden cronolgico segn el da del correspondiente registro (la
hora de registro no es un dato relevante para ninguna operacin y no se
proporciona). En un mismo da se puede registrar cualquier cantidad de
peticiones de cualquier tipo (incluso ninguna).

Aprovecharemos el mencionado orden cronolgico para usar las fechas de las
diversas peticiones como indicativo del paso de los das. As, tanto la
ventana de los D das hbiles de la agenda como la de los K das relevantes de
las citas ya realizadas irn desplazndose segn vayan avanzando los das de
registro de las sucesivas peticiones.

Ejemplo: supongamos que D = 60 y K = 90 y que se han registrado todas las
peticiones del da 134, (las citas y anulaciones de la agenda estarn
comprendidas entre los das 135 y 194; las citas ya realizadas relevantes
estarn comprendidas entre los das 44 y 133).

En cuanto llegue la primera peticin registrada el da 135, dicho da deja de
ser hbil para nuevas citas y el 195 pasa a serlo. Anlogamente, los das
relevantes para las citas ya realizadas el da 135 pasan a ser los
comprendidos entre el 45 y el 134.

Esta situacin se mantendr mientras sigan tratndose peticiones registradas el
da 135 y volver a cambiar cuando se trate la primera peticin del siguiente
da. ste ha de ser mayor o igual que 136, pero no necesariamente el 136, ya
que puede haber das sin peticiones.


SE PIDE
=======

Disear un programa modular razonablemente eficiente que permita modelar la
agenda descrita, simulando las peticiones y anulaciones de citas, as como las
las consultas.

En primer lugar, debe leer el nmero total N de funcionarios, los nmeros D y
K de das relevantes para la agenda y las consultas y el nmero H de horas
diarias dedicadas a atender citas.

Seguidamente leer el organigrama funcionarial, con las relaciones jerrquicas
entre los diferentes funcionarios. Despus tendr que ir procesando las
diversas tareas que se le pidan.  Estas podrn ser las siguientes:

1) Peticin de cita. Se proporcionar el da del registro, el modelo de
   peticin y los datos necesarios segn dicho modelo. Usaremos el valor 1 para
   indicar el modelo de prioridad por da y el valor 2 para indicar el modelo
   de prioridad por nivel. El resto de datos son, para el modelo 1, el da y
   hora preferidos para la cita; y, para el modelo 2, la hora y el nivel
   preferidos para la cita

2) Peticin de das u horas libres. Se proporcionar el identificador del
   funcionario, el da del registro y los datos necesarios segn el modelo de
   peticin. Usaremos el valor 1 para indicar el modelo de intervalo de das
   libres y el valor 2 para indicar el modelo de horas sueltas. El resto de
   datos son, para el modelo 1, los dos extremos del intervalo de das libres
   y, para el modelo 2, el da y la hora a anular

3) Peticin de consulta de citas ya realizadas. Sus nico dato ser el da del
   registro

4) Peticin de consulta de citas vivas. Su nico dato ser el da del registro


La forma de comunicarnos con el programa para que realice dichas tareas ser
parecida a la del caso de estudio "Cubeta" que aparece 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 tres semanas antes del da de entrega 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.
