#include <string>
#include <memory>
#include <cmath>
#include <sstream>

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

class Triangle : public Figure {
 public:
    double a;
    double b;
    double c;

    Triangle(int a, int b, int c) : a(a), b(b), c(c) {
    }

    std::string Name() {return "Triangle";}
    double Perimeter() {return (a + b + c);}
    double Area() {
        double p = (a + b + c) / 2;
        double area = sqrt(p * (p - a) * (p - b) * (p - c));
        return area;
    }
};

class Rect : public Figure {
 private:
    double width;
    double height;

 public:
    Rect(double w, double h) : width(w), height(h) {
    }

    std::string Name() {return "Rect";}
    double Perimeter() {return (2 * (width + height));}
    double Area() {return (width * height);}
};

class Circle : public Figure {
 public:
    double r;

    explicit Circle(int r) : r(r) {
    }

    std::string Name() {return "Circle";}
    double Perimeter() {return (6.28 * r);}
    double Area() {return (3.14 + pow(r, 2));}
};

// template <typename T>
std::shared_ptr<Figure> CreateFigure(std::istringstream& is) {
    std::string command;
    is >> command;
    is >> ws;
    if (command == "RECT") {
        double width;
        double height;
        is >> width >> height;
        return std::make_shared<Rect>(width, height);
    }
    if (command == "TRIANGLE") {
        double a;
        double b;
        double c;
        is >> a >> b >> c;
        return std::make_shared<Triangle>(a, b, c);
    }
    double r;
    is >> r;
    return std::make_shared<Circle>(r);
}