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

const double PI = 3.14;

class Figure {
 public:
    explicit Figure(const std::string& type)
            : Type(type) {
    }
    virtual std::string Name() = 0;
    virtual double Perimeter() = 0;
    virtual double Area() = 0;
    const std::string Type;
};

class Rect : public Figure {
 public:
    Rect(const int& width, const int& height)
            : Figure("RECT"),
              perimeter(2 * width + 2 * height),
              area(width * height) {
    }
    std::string Name() override {
        return Type;
    }
    double Perimeter() override {
        return perimeter;
    }
    double Area() override {
        return area;
    }
 private:
    double perimeter;
    double area;
};

class Triangle : public Figure {
 public:
    Triangle(const int& x, const int& y, const int& z)
            : Figure("TRIANGLE") {
        perimeter = x + y + z;
        double h_p = perimeter / 2;
        area = sqrt(h_p * (h_p - x) * (h_p - y) * (h_p - z));
    }
    std::string Name() override {
        return Type;
    }
    double Perimeter() override {
        return perimeter;
    }
    double Area() override {
        return area;
    }
 private:
    double perimeter;
    double area;
};

class Circle : public Figure {
 public:
    explicit Circle(const int& radius)
            : Figure("CIRCLE"),
              perimeter(2 * PI * radius),
              area(PI * radius * radius) {
    }
    std::string Name() override {
        return Type;
    }
    double Perimeter() override {
        return perimeter;
    }
    double Area() override {
        return area;
    }
 private:
    double perimeter;
    double area;
};

std::shared_ptr<Figure> CreateFigure(std::istringstream& is) {
    std::string name;
    is >> name;
    if (name == "RECT") {
        int width, height;
        is >> width >> height;
        return std::make_shared<Rect>(width, height);
    } else if (name == "TRIANGLE") {
        int x, y, z;
        is >> x >> y >> z;
        return std::make_shared<Triangle>(x, y, z);
    } else {
        int radius;
        is >> radius;
        return std::make_shared<Circle>(radius);
    }
}