import java.util.List;
import java.util.Queue;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Stack;
import java.util.Vector;
import java.util.PriorityQueue;

public class Assignment1
{
  private ArrayList<List<Integer>> lists = new ArrayList<List<Integer>>();
  private ArrayList<Queue<Integer>> queues = new ArrayList<Queue<Integer>>();
  
  public Assignment1() {
    lists.add(new ArrayList<Integer>());
    lists.add(new LinkedList<Integer>());
    lists.add(new Stack<Integer>());
    lists.add(new Vector<Integer>());

    queues.add(new LinkedList<Integer>());
    queues.add(new PriorityQueue<Integer>());
  }
  
  public static void main(String[] args)
   {
     Assignment1 bench = new Assignment1();
      long seed = 0; 
      if ( args.length > 0 )
      {
        int arglength = args.length;
         if ( args[ 0 ].equals("-s") )
         {
            seed = Long.parseLong( args[ 1 ] );

            if ( arglength > 2 )
            {
              int mutations[] = new int[args.length - 2];
              for ( int i = 2; i < (arglength - 1); i++ )
                   mutations[i - 2] = Integer.parseInt( args[ i ] );

               bench.benchmark(seed, mutations);
            }
            else
              bench.benchmark(seed);
         }

         else 
         {
           int mutations[] = new int[args.length];
            for ( int i = 0; i < arglength; i++ )
               mutations[i] = Integer.parseInt( args[ i ] );

            bench.benchmark(seed, mutations);
         }
      }
      else
        bench.benchmark();
   }

   public void benchmark() 
   {
     for (List<Integer> list : lists) {
       ListTimer timer = new ListTimer(list);
       System.out.print(list.getClass().getSimpleName());
       System.out.print(":    ");
       System.out.println(timer.time());
     }
     for (Queue<Integer> queue : queues) {
       QueueTimer timer = new QueueTimer(queue);
       System.out.print(queue.getClass().getSimpleName());
       System.out.print(":    ");
       System.out.println(timer.time());
     }
   }

   public void benchmark(long elemGenSeed) 
   {
     for (List<Integer> list : lists) {
       ListTimer timer = new ListTimer(list, elemGenSeed);
       System.out.print(list.getClass().getSimpleName());
       System.out.print(":    ");
       System.out.println(timer.time());
     }
     for (Queue<Integer> queue : queues) {
       QueueTimer timer = new QueueTimer(queue, elemGenSeed);
       System.out.print(queue.getClass().getSimpleName());
       System.out.print(":    ");
       System.out.println(timer.time());
     }
   }

   public void benchmark(long elemGenSeed, int[] mutations)
   {
     for (List<Integer> list : lists) {
       ListTimer timer = new ListTimer(list, elemGenSeed);
       System.out.print(list.getClass().getSimpleName());
       System.out.print(":    ");
       System.out.println(timer.time(mutations));
     }
     for (Queue<Integer> queue : queues) {
       QueueTimer timer = new QueueTimer(queue, elemGenSeed);
       System.out.print(queue.getClass().getSimpleName());
       System.out.print(":    ");
       System.out.println(timer.time(mutations));
     }
   }

   private static void errorExit(String msg)
   {
   }
}