#include <algorithm>
#include <iostream>

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

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

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

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

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

   delete[] arr.p;
}
