#include <algorithm>
#include <iostream>

class arreglo_dinamico {
   int cap = 1, tam = 0;
   int* p = new int[1];

public:
   ~arreglo_dinamico( ) {        // destructor
      delete[] p;
   }

   int size( ) {                 // acceso al valor de tam, pero sin permiso de modificarlo
      return tam;
   }

   int& operator[](int i) {      // retorno por referencia y sobrecarga de arr[i]
      return p[i];
   }

   void agrega(int v) {
      if (tam == cap) {
         int* q = new int[2 * cap];
         for (int i = 0; i < tam; ++i) {
            q[i] = p[i];
         }
         delete[] p;
         p = q;
         cap *= 2;
      }

      p[tam] = v;
      tam += 1;
   }

   void quita_ultimo( ) {
      tam -= 1;
   }
};

int main( ) {
   arreglo_dinamico arr;

   for (;;) {
      std::cout << "Elige una opcion:\n";
      std::cout << "1. Agregar un elemento.\n";
      std::cout << "2. Quitar el ultimo elemento.\n";
      std::cout << "3. Ver el arreglo.\n";
      std::cout << "4. Salir.\n";

      int opcion;
      std::cin >> opcion;

      if (opcion == 1) {
         std::cout << "Dame el valor del elemento: ";
         int valor;
         std::cin >> valor;
         arr.agrega(valor);
      } else if (opcion == 2) {
         if (arr.size( ) == 0) {
            std::cout << "Error: el arreglo esta vacio.\n";
         } else {
            arr.quita_ultimo( );
         }
      } else if (opcion == 3) {
         for (int i = 0; i < arr.size( ); ++i) {
            std::cout << arr[i] << " ";
         }
         std::cout << "\n";
      } else if (opcion == 4) {
         break;
      } else {
         std::cout << "Opcion incorrecta.\n";
      }

      std::cout << "\n";
   }
}
