#include <vector>
 
template<typename T>
class Listoid;
template<typename T>
Listoid<T> cons(T new_elem, Listoid<T> list);
 
template<typename T>
class Listoid{
 
  private:
    std::vector<T> list;
 
  public:
    typedef typename std::vector<T>::iterator iterator;
 
    iterator begin() {return list.begin();}
    iterator end() {return list.end();}
 
  public:
    Listoid(T t) {
      list.push_back(t);
    }
 
  const T operator [](int i){
    return list[i];
  }
 
  void addElem(T ne){
    list.push_back(ne);
  }
 
  friend Listoid<T> cons <>(T new_elem, Listoid<T> list);
 
};
 
template<typename T>
Listoid<T> cons(T new_elem, Listoid<T> list){
 
  Listoid<T> new_list(new_elem);
  for(typename Listoid<T>::iterator it = list.begin(), e = list.end();
        it != e; ++it){
          new_list.addElem(*it);
        }
  return new_list;
}
 
 
int main(){
 
  Listoid<int> lista(312);
  lista.addElem(22);
 
  Listoid<int> lista2 = cons(21, lista);
 
  return 0;
}
				I2luY2x1ZGUgPHZlY3Rvcj4KCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmNsYXNzIExpc3RvaWQ7CnRlbXBsYXRlPHR5cGVuYW1lIFQ+Ckxpc3RvaWQ8VD4gY29ucyhUIG5ld19lbGVtLCBMaXN0b2lkPFQ+IGxpc3QpOwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KY2xhc3MgTGlzdG9pZHsKCiAgcHJpdmF0ZToKICAgIHN0ZDo6dmVjdG9yPFQ+IGxpc3Q7CgogIHB1YmxpYzoKICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjp2ZWN0b3I8VD46Oml0ZXJhdG9yIGl0ZXJhdG9yOwoKICAgIGl0ZXJhdG9yIGJlZ2luKCkge3JldHVybiBsaXN0LmJlZ2luKCk7fQogICAgaXRlcmF0b3IgZW5kKCkge3JldHVybiBsaXN0LmVuZCgpO30KCiAgcHVibGljOgogICAgTGlzdG9pZChUIHQpIHsKICAgICAgbGlzdC5wdXNoX2JhY2sodCk7CiAgICB9CgogIGNvbnN0IFQgb3BlcmF0b3IgW10oaW50IGkpewogICAgcmV0dXJuIGxpc3RbaV07CiAgfQoKICB2b2lkIGFkZEVsZW0oVCBuZSl7CiAgICBsaXN0LnB1c2hfYmFjayhuZSk7CiAgfQoKICBmcmllbmQgTGlzdG9pZDxUPiBjb25zIDw+KFQgbmV3X2VsZW0sIExpc3RvaWQ8VD4gbGlzdCk7Cgp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KTGlzdG9pZDxUPiBjb25zKFQgbmV3X2VsZW0sIExpc3RvaWQ8VD4gbGlzdCl7CgogIExpc3RvaWQ8VD4gbmV3X2xpc3QobmV3X2VsZW0pOwogIGZvcih0eXBlbmFtZSBMaXN0b2lkPFQ+OjppdGVyYXRvciBpdCA9IGxpc3QuYmVnaW4oKSwgZSA9IGxpc3QuZW5kKCk7CiAgICAgICAgaXQgIT0gZTsgKytpdCl7CiAgICAgICAgICBuZXdfbGlzdC5hZGRFbGVtKCppdCk7CiAgICAgICAgfQogIHJldHVybiBuZXdfbGlzdDsKfQoKCmludCBtYWluKCl7CgogIExpc3RvaWQ8aW50PiBsaXN0YSgzMTIpOwogIGxpc3RhLmFkZEVsZW0oMjIpOwoKICBMaXN0b2lkPGludD4gbGlzdGEyID0gY29ucygyMSwgbGlzdGEpOwoKICByZXR1cm4gMDsKfQ==