public class AppointmentBook
{
    // package access for testing
    // [period - 1][minute]
    boolean[][] freeMinutes;
    
    public AppointmentBook()
    {
        freeMinutes = new boolean[8][60];
        
        for(int r = 0; r < freeMinutes.length; r++)
            for(int c = 0; c < freeMinutes[0].length; c++)
                freeMinutes[r][c] = true;
    }
    
    private boolean isMinuteFree(int period, int minute)
    {
        return freeMinutes[period - 1][minute];
    }
    
    // package access for testing
    void reserveBlock(int period, int startMinute, int duration)
    {
        for(int minute = startMinute; minute < startMinute + duration; minute++)
            freeMinutes[period - 1][minute] = false;
    }
    
    public int findFreeBlock(int period, int duration)
    {
        int freeInARow = 0;
        
        for(int minute = 0; minute <= 59; minute++)
        {
            if(isMinuteFree(period, minute))
                freeInARow++;
            else
                freeInARow = 0;
            
            if(freeInARow == duration)
                return minute - freeInARow + 1;
        }
        
        return -1;
    }
    
    public boolean makeAppointment(int startPeriod, int endPeriod,
                                   int duration)
    {
        for(int period = startPeriod; period <= endPeriod; period++)
        {
            int startMinute = findFreeBlock(period, duration);
            
            if(startMinute != -1)
            {
                reserveBlock(period, startMinute, duration);
                return true;
            }
        }
        
        return false;
    }
}
