// ---------- PREGUNTA1 ------------

// Archivo Tabla.java

import java.io.*;



class TablaLLena extends Exception{}

class NoExiste extends Exception {}



public class Tabla{

	protected int n;

	protected String[] a;

	public Tabla(int x){

		a = new String[x];

		n = 0;

	}

	public void agregar(String x)throws TablaLLena{

		if(n>=a.length) throw new TablaLLena();

		a[n++]=x; 

	}

	public int indice(String x)throws NoExiste{

		for (int i=0 ; i<n ; ++i )

			if( a[i].equals(x) ) return i;

		throw new NoExiste();

	}

}



// ---------- PREGUNTA2 ------------

//Archivo p2.java

public class Pregunta2 {

    public static void main(String[] args) throws InterruptedException {

        String[] a = { "atre", "daa", "bdf", "cfd" };

        System.out.println(mayor(a)); //escribe: "daa" en pantalla



        String[][] m = { { "a", "g", "d" }, { "q", "z", "a" }, { "f", "f", "y" }, { "o", "m", "q" } };

        System.out.println(mayor(m)); //escribe: "z" en pantalla

    }



    static public Comparable mayor(Comparable[] x) throws InterruptedException {

        int im = x.length / 2;

        MayorComparable m1 = new MayorComparable(x, 0, im), 

			m2 = new MayorComparable(x, im + 1, x.length - 1);

        m1.start();

        m2.start();

        m1.join();

        Comparable mayor1 = m1.getMayor();

        m2.join();

        Comparable mayor2 = m2.getMayor();

        return mayor1.compareTo(mayor2) > 0 ? mayor1 : mayor2;

    }



    static public Comparable mayor(Comparable[][] x) throws InterruptedException {

        Comparable[] m = new Comparable[x.length];

        for (int i = 0; i < x.length; ++i) {

            m[i] = mayor(x[i]);

        }

        return mayor(m);

    }

}



class MayorComparable extends Thread {

    private Comparable[] a;



    private int ip, iu; //indices de primero y ultimo



    private Comparable mayor;



    public MayorComparable(Comparable[] x, int ip, int iu) {

        a = x;

        this.ip = ip;

        this.iu = iu;

    }



    public void run() {

        mayor = a[ip];

        for (int i = ip; i <= iu; ++i)

            if (a[i].compareTo(mayor) > 0)

                mayor = a[i];

    }



    public Comparable getMayor() {

        return mayor;

    }

}

