// File: Nastro.java
// Time-stamp: "2003-03-13 14:48:38 calvanes"
// Scopo: esercizio di esame - prima parte

class NodoLista {
  public String nome;
  public int durata;
  public NodoLista next;
}


public class Nastro {

  private int capienza;   // capienza residua del nastro
  private int numero;     // numero di programmi memorizzati sul nastro
  private NodoLista programmi;

  public Nastro(int k) {
    capienza = k;
    numero = 0;
    programmi = null;
  }

  public int capienzaResidua() {
    return capienza;
  }

  public int quantiProgrammi() {
    return numero;
  }

  public void memorizza(String nome, int durata) {
    if (capienza < durata)
      throw new RuntimeException("Nastro pieno");
    else {
      // inserisce il programma in testa alla lista;
      // in questo modo i programma compaiono nella lista in ordine inverso
      // rispetto a quello in cui sono stati inseriti, ovvero in ordine inverso
      // rispetto alla lore posizione
      NodoLista aux = new NodoLista();
      aux.nome = nome;
      aux.durata = durata;
      aux.next = programmi;
      programmi = aux;

      numero++;
      capienza = capienza - durata;
    }
  }

  public String qualeProgramma(int n) {
    return trovaNodo(programmi, numero-1-n).nome;
  }

  public int qualeDurata(int n) {
    return trovaNodo(programmi, numero-1-n).durata;
  }

  private static NodoLista trovaNodo(NodoLista lis, int pos) {
    if (pos < 0 || lis == null)
      throw new RuntimeException("Programma inesistente");
    else if (pos == 0)
      return lis;
    else
      return trovaNodo(lis.next, pos-1);
  }
}
