class DoidonaSemTADsProntas {
   final int TAMT1 = 100;
   final int TAMT3 = 100;
   final int NULO = -0x7FFFFF;

   int[] t1;
   int[] t3;

   Celula primeiroListaT2, ultimoListaT2;
   No raizArvoreT2, raizArvoreT3;

   public Doidona (){
      t1 = new int[TAMT1];
      t3 = new int[TAMT3];

      for(int i = 0; i < TAMT1; i++){
         t1[i] = NULO;
      }
      for(int i = 0; i < TAMT3; i++){
         t3[i] = NULO;
      }

      primeiroListaT2 = ultimoListaT2 = new Celula();

      raizArvoreT2 = raizArvoreT3 = null;
   }

   public int hashT1(int elemento){
   }

   public int hashT2(int elemento){
   }

   public int hashT3(int elemento){
   }

   public int rehashT3(int elemento){
   }

   public void inserir(int elemento){
      int i = hashT1(elemento);

      if(elemento == NULO){
         // gerar msg de erro!!!!
      } else if(t1[i] == NULO){
         t1[i] = elemento;
      }else if(hashT2(elemento) == 0){
         inserirT3(elemento);
      }else if (hashT2(elemento) == 1){
         inserirLista(elemento);
      }else if (hashT2(elemento) == 2){
         raizArvoreT2 = inserirArvore(raizArvoreT2, elemento);
      } else {
         System.out.println("ERRO!!!!");
      }
   }

   public void inserirT3(int elemento){
      int i = hashT3(elemento);

      if(t3[i] == NULO){
         t3[i] = elemento;
      } else {
         i = rehashT3(elemento);

         if(t3[i] == NULO){
            t3[i] = elemento;
         } else {
            raizArvoreT3 = inserirArvore(raizArvoreT3, elemento);
         }
      }
   }

   public void inserirLista(int elemento){
      ultimoListaT2.prox = new Celula(elemento);
      ultimoListaT2 = ultimoListaT2.prox;
   }

   public No inserirArvore(No no, int elemento){
      if(no == null){
         no = new No (elemento);
      } else if (no.elemento < elemento){
         no.esq = inserirArvore(no.esq, elemento);
      } else if (no.elemento > elemento){
         no.dir = inserirArvore(no.dir, elemento);
      } else {
         System.out.println("Erro de Insercao");
      }
      return no;
   }

   public boolean pesquisar(int elemento){
      boolean resp;
      int i = hashT1(elemento);
      if(t1[i] == NULO){
         resp = false;
      }else if(t1[i] == elemento){
         resp = true;
      }else if(hashT2(elemento) == 0){
         resp = pesquisarT3(elemento);
      }else if (hashT2(elemento) == 1){
         resp = pesquisarLista(elemento);
      }else if (hashT2(elemento) == 2){
         resp = pesquisarArvore(raizArvoreT2, elemento);
      } else {
         resp = false;
         System.out.println("ERRO!!!!");
      }
      return resp;
   }

   public boolean pesquisarT3(int elemento){
      int i = hashT3(elemento);

      if(t3[i] == NULO){
         resp = false;
      }else if(t3[i] == elemento){
         resp = true;
      } else {
         i = rehashT3(elemento);

         if(t3[i] == NULO){
            resp = false;
         } else if(t3[i] == elemento){
            resp = true;
         } else {
            resp = pesquisarArvore(raizArvoreT3, elemento);
         }
      }

      return resp;
   }

   public boolean pesquisarLista(int elemento){
      boolean resp = false;
      for(Celula i = primeiroListaT2.prox; i != null; i = i.prox){
         if(i.elemento == elemento){
            resp = true;
            i = ultimoListaT2;
         }
      }
      return resp;
   }

   public boolean pesquisarArvore(No no, int elemento){
      boolean resp;

      if(no == null){
         resp = false;
      } else if (no.elemento < elemento){
         resp = pesquisarArvore(no.esq, elemento);
      } else if (no.elemento > elemento){
         resp = pesquisarArvore(no.dir, elemento);
      } else {
         resp = true;
      }
      return resp;
   }
}
