#include <iostream>

constexpr int cap = 10;

struct doble_cola {
   int mem[cap];
   int ini = 0, tam = 0;

   void push_back(int v) {
      mem[(ini + tam++) % cap] = v;
   }
   
   void pop_back( ) {
      tam -= 1;
   }

   void push_front(int v) {
      ini = (ini - 1 + cap) % cap;
      mem[ini] = v;
      tam += 1;
   }
   
   void pop_front( ) {
      ini = (ini + 1) % cap;
      tam -= 1;
   }

   int size( ) {
      return tam;
   }

   int operator[](int i) {
      return mem[(ini + i) % cap];
   }
};

int main( ) {
   doble_cola dc;

   dc.push_back(5);      // { 5 }
   dc.push_back(9);      // { 5, 9 }
   dc.push_front(7);     // { 7, 5, 9 }
   dc.push_front(3);     // { 3, 7, 5, 9 };
   dc.push_front(8);     // { 8, 3, 7, 5, 9 };
   dc.pop_back( );       // { 8, 3, 7, 5 }
   dc.pop_front( );      // { 3, 7, 5 }

   for (int i = 0; i < dc.size( ); ++i) {
      std::cout << dc[i] << " ";
   }
}
