#include <iostream>
#include <map>
#include <vector>
using namespace std;
class Io_obj
{
public:
virtual Io_obj* clone() const =0;
virtual ~Io_obj(){}
};
class Io_circle : public Io_obj
{
string c;
public:
Io_circle(string& s):c{s}{cout << c << '\n';}
Io_circle* clone() const override{return new Io_circle{*this};}
static Io_obj* new_circle(string& s){return new Io_circle{s};}
};
class Io_triangle : public Io_obj
{
string t;
public:
Io_triangle(string& s):t{s}{cout << t << '\n';}
Io_triangle* clone() const override{return new Io_triangle{*this};}
static Io_obj* new_triangle(string& s){return new Io_triangle{s};}
};
using Pf = Io_obj*(*)(std::string&);
std::map<std::string,Pf> io_map{{"circle",&Io_circle::new_circle},{"triangle",&Io_triangle::new_triangle}};
std::vector<std::string> vs{"circle","triangle"};
Io_obj* get_obj(int i){
string word = vs[i];
if(auto f=io_map[word]){
return f(word);
}else{
throw runtime_error{"shape not found"};
}
}
int main() {
// your code goes here
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8dmVjdG9yPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIElvX29iagp7CnB1YmxpYzoKICAgIHZpcnR1YWwgSW9fb2JqKiBjbG9uZSgpIGNvbnN0ID0wOwogICAgdmlydHVhbCB+SW9fb2JqKCl7fQp9OwoKCmNsYXNzIElvX2NpcmNsZSA6IHB1YmxpYyBJb19vYmoKewogICAgc3RyaW5nIGM7CnB1YmxpYzoKICAgIElvX2NpcmNsZShzdHJpbmcmIHMpOmN7c317Y291dCA8PCBjIDw8ICdcbic7fQogICAgSW9fY2lyY2xlKiBjbG9uZSgpIGNvbnN0IG92ZXJyaWRle3JldHVybiBuZXcgSW9fY2lyY2xleyp0aGlzfTt9CiAgICBzdGF0aWMgSW9fb2JqKiBuZXdfY2lyY2xlKHN0cmluZyYgcyl7cmV0dXJuIG5ldyBJb19jaXJjbGV7c307fQp9OwoKCmNsYXNzIElvX3RyaWFuZ2xlIDogcHVibGljIElvX29iagp7CiAgICBzdHJpbmcgdDsKcHVibGljOgogICAgSW9fdHJpYW5nbGUoc3RyaW5nJiBzKTp0e3N9e2NvdXQgPDwgdCA8PCAnXG4nO30KICAgIElvX3RyaWFuZ2xlKiBjbG9uZSgpIGNvbnN0IG92ZXJyaWRle3JldHVybiBuZXcgSW9fdHJpYW5nbGV7KnRoaXN9O30KICAgIHN0YXRpYyBJb19vYmoqIG5ld190cmlhbmdsZShzdHJpbmcmIHMpe3JldHVybiBuZXcgSW9fdHJpYW5nbGV7c307fQp9OwoKCnVzaW5nIFBmID0gSW9fb2JqKigqKShzdGQ6OnN0cmluZyYpOwpzdGQ6Om1hcDxzdGQ6OnN0cmluZyxQZj4gaW9fbWFwe3siY2lyY2xlIiwmSW9fY2lyY2xlOjpuZXdfY2lyY2xlfSx7InRyaWFuZ2xlIiwmSW9fdHJpYW5nbGU6Om5ld190cmlhbmdsZX19OwpzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdnN7ImNpcmNsZSIsInRyaWFuZ2xlIn07CgpJb19vYmoqIGdldF9vYmooaW50IGkpewogICAgc3RyaW5nIHdvcmQgPSB2c1tpXTsKCiAgICBpZihhdXRvIGY9aW9fbWFwW3dvcmRdKXsKICAgICAgICByZXR1cm4gZih3b3JkKTsKICAgIH1lbHNlewogICAgICAgIHRocm93IHJ1bnRpbWVfZXJyb3J7InNoYXBlIG5vdCBmb3VuZCJ9OwogICAgfQp9CgoKaW50IG1haW4oKSB7CgkvLyB5b3VyIGNvZGUgZ29lcyBoZXJlCglyZXR1cm4gMDsKfQ==