#include <algorithm>
#include <iostream>

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

   ~arreglo_dinamico( ) {
      delete[] p;
   }

   void agrega(int valor) {
      if (tam == cap) {
         int* q = new int[2 * cap];
         std::copy(p, p + tam, q);
         delete[] p;
         p = q;
         cap *= 2;
      }
      p[tam++] = valor;
   }

   void quita( ) {
      tam -= 1;
   }

   int operator[](int i) {
      return p[i];
   }
};

int main( ) {
   arreglo_dinamico a;

   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;
         a.agrega(valor);
      } else if (opcion == 2) {
         if (a.tam == 0) {
            std::cout << "Error: el arreglo esta vacio.\n";
         } else {
            a.quita( );
         }
      } else if (opcion == 3) {
         for (int i = 0; i < a.tam; ++i) {
            std::cout << a[i] << " ";
         }
         std::cout << "\n";
      } else if (opcion == 4) {
         break;
      } else {
         std::cout << "Opcion incorrecta.\n";
      }
      
      std::cout << "\n";
   }
}
