import java.io.*;

public class ParkingLot {

  ParkingPlace[] places;

  public ParkingLot(int n) {
    places = new ParkingPlace[n];
    for (int i = 0; i < n; i++)
      places[i] = new ParkingPlace();
  }

  public int firstFreePlace() {
    for (int i = 0; i < places.length; i++)
      if (places[i].free()) return i;
    return -1;
  }

  public int countFreePlaces() {
    int count = 0;
    for (int i = 0; i < places.length; i++)
      if (places[i].free()) count++;
    return count;
  }

  public int[] freePlaces() {
    int[] freeP = new int[countFreePlaces()];
    int j = 0;
    for (int i = 0; i < places.length; i++)
      if (places[i].free()) {
        freeP[j] = i;
        j++;
      }
    return freeP;
  }

  public void carEnters(String a, int hour, int minutes) {
    int first = firstFreePlace();
    if (first != -1) places[first].carArrives(a, hour, minutes);
  }

  public void carExits(String a) {
    for (int i = 0; i < places.length; i++)
      if (!places[i].free() && a.equals(places[i].getCar())) {
        places[i].carLeaves();
        return;
      }
  }

  public int longestParkedCar() {
    int max = -1;
    int imax = -1;
    for (int i = 0; i < places.length; i++)
      if (places[i].free() &&
          places[i].getHour() * 60 + places[i].getMinutes() > max) {
        max = places[i].getHour() * 60 + places[i].getMinutes();
        imax = i;
      }
    return imax;
  }

  public String[] allParkedCars() {
    String[] temp = new String[places.length];
    int j = 0;
    for (int i = 0; i < places.length; i++) {
      if (!places[i].free()) temp[j] = places[i].getCar();
      j++;
    }

    String[] cars = new String[j];
    for (int i = 0; i < j; i++)
      cars[i] = temp[i];

    return cars;
  }

  public static ParkingLot readParkingLotFromFile(String filename)
                                                          throws IOException {
    int num = countParkingPlacesFile(filename);
    ParkingLot lot = new ParkingLot(num);

    FileReader f = new FileReader(filename);
    BufferedReader br = new BufferedReader(f);
    for (int i = 0; i < num; i++) {
      lot.places[i] = readParkingPlace(br);
    }
    f.close();

    return lot;
  }

  public void writeParkingLotToFile(String filename) throws IOException {
    FileWriter f = new FileWriter(filename);
    PrintWriter out = new PrintWriter(f);

    for (int i = 0; i < places.length; i++) {
      out.println(places[i].free() + "\n" +
                  (places[i].free()? "" : places[i].getCar()) + "\n" +
                  (places[i].free()? "" :
                   Integer.toString(places[i].getHour())) + "\n" +
                  (places[i].free()? "" :
                   Integer.toString(places[i].getMinutes())) +
                  "\n");
    }
  }

  // auxiliary methods

  private static ParkingPlace readParkingPlace(BufferedReader br)
                                                           throws IOException {
    String s = br.readLine();
    if (s == null)
      return null;
    else {
      boolean free = s.equals("true");
      String plate = br.readLine();
      int hour = Integer.parseInt(br.readLine());
      int minutes = Integer.parseInt(br.readLine());
      ParkingPlace pp = new ParkingPlace();
      if (!free) pp.carArrives(plate, hour, minutes);
      return pp;
    }
  }

  private static int countParkingPlacesFile(String filename)
                                                           throws IOException {
    FileReader f = new FileReader(filename);
    BufferedReader br = new BufferedReader(f);
    int i = 0;

    String s = br.readLine();
    while (s != null) {
      br.readLine();
      br.readLine();
      i++;
      s = br.readLine();
    }
    f.close();
    return i;
  }
}
