#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==