#include <string>
#include <memory>
using std::string;
using std::make_shared;

class Figure {
 public:
    virtual string Name() const = 0;
    virtual double Perimeter() const = 0;
    virtual double Area() const = 0;
};

class Triangle : public Figure {
 private:
    int a, b, c;
 public:
    Triangle(const int& a, const int& b, const int& c) : a(a), b(b), c(c) {}
    string Name() {
        return "TRIANGLE";
    }
    double Perimeter() {
        return a + b + c;
    }
    double Area() {
        double p = Perimeter() / 2;
        return sqrt(p * (p - a) * (p - b) * (p - c));
    }
};

class Rect : public Figure {
 private:
    int a, b;
 public:
    Rect(const int& a, const int& b) : a(a), b(b) {}
    string Name() {
        return "RECT";
    }
    double Perimeter() {
        return 2 * (a + b);
    }
    double Area() {
        return a * b;
    }
};

class Circle : public Figure {
 private:
    int r;
 public:
    Circle(const int& r) : r(r) {}
    string Name() {
        return "CIRCLE";
    }
    double Perimeter() {
        return r * 6.28;
    }
    double Area() {
        return r * r * 3.14;
    }
};

std::shared_ptr<Figure> CreateFigure(std::istringstream stream) {
    std::shared_ptr<Figure> res;
    string figure;
    stream >> figure;
    if (figure == "TRIANGLE") {
        int a, b, c;
        stream >> a >> b >> c;
        res = make_shared<Triangle>(a, b, c);
    } else if (figure == "RECT") {
        int a, b;
        stream >> a >> b;
        res = make_shared<Rect>(a, b);
    } else if (figure == "CIRCLE") {
        int r;
        stream >> r;
        res = make_shared<Circle>(r);
    }

    return res;
}