#include <iostream>
#include <sstream>
#include <iomanip>
#include <memory>
#include <string>
#include <vector>
#include <cmath>

const float PI = 3.14;

class Figure {
 public:
    explicit Figure(const std::string &name) : name_(name) {}

    virtual std::string Name() = 0;

    virtual double Perimeter() = 0;

    virtual double Area() = 0;

    const std::string name_;
};

class Rect : public Figure {
 public:
    Rect(const std::string &name, const double &width, const double &height)
    : Figure(name)
    , width_(width)
    , height_(height)
    {}

    std::string Name() override {
        return name_;
    }

    double Perimeter() override {
        return (width_ + height_) * 2;
    }

    double Area() override {
        return width_ * height_;
    }

 private:
    const double width_;
    const double height_;
};

class Triangle : public Figure {
 public:
    Triangle(const std::string &name, double a, double b, double c)
    : Figure(name)
    , a(a)
    , b(b)
    , c(c)
    {}

    std::string Name() override {
        return name_;
    }

    double Perimeter() override {
        return a + b + c;
    }

    double Area() override {
        double p = this->Perimeter() / 2;
        return sqrt(p * (p - a) * (p - b) * (p - c));
    }

 private:
    double a, b, c;
};

class Circle : public Figure {
 public:
    Circle(const std::string &name, double r) : Figure(name), radius(r) {}

    std::string Name() override {
        return name_;
    }

    double Perimeter() override {
        return 2 * radius * PI;
    }

    double Area() override {
        return PI * radius * radius;
    }

 private:
    double radius;
};

std::shared_ptr<Figure> CreateFigure(std::istringstream &is) {
    std::string figure_name;
    is >> figure_name;
    if (figure_name == "RECT") {
        double w, h;
        is >> w >> h;
        return std::make_shared<Rect>(figure_name, w, h);
    } else if (figure_name == "TRIANGLE") {
        double a, b, c;
        is >> a >> b >> c;
        return std::make_shared<Triangle>(figure_name, a, b, c);
    } else {
        double r;
        is >> r;
        return std::make_shared<Circle>(figure_name, r);
    }
}