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

using std::string;
using std::cout;
using std::vector;
using std::cin;
using std::endl;
using std::fixed;

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

class Triangle : public Figure {
public:
    Triangle(double a, double b, double c) : a_(a), b_(b), c_(c) {}
    string Name() override {
        return "TRIANGLE";
    }
    double Perimeter() override {
        return a_ + b_ + c_;
    }
    double Area() override {
        return sqrt(Perimeter() / 2 * (Perimeter() / 2 - a_)
            * (Perimeter() / 2 - b_) * (Perimeter() / 2 - c_));
    }
private:
    const double a_;
    const double b_;
    const double c_;
};

class Rect : public Figure {
public:
    Rect(double width, double height) :
        width_(width), height_(height) {}
    string Name() override {
        return  "RECT";
    }
    double Perimeter() override {
        return (width_ + height_) * 2;
    }
    double Area() override {
        return width_ * height_;
    }

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

class Circle : public Figure {
public:
    Circle(double r) : r_(r) {}
    string Name() override {
        return "CIRCLE";
    }
    double Perimeter() override {
        return 2 * 3.14 * r_;
    }
    double Area() override {
        return 3.14 * r_ * r_;
    }

private:
    const double r_;
};

std::shared_ptr<Figure> CreateFigure(std::istream& input) {
    string name;
    input >> name;
    if (name == "RECT") {
        double width, height;
        input >> width >> height;
        return std::make_shared<Rect>(width, height);
    }
    else if (name == "TRIANGLE") {
        double a, b, c;
        input >> a >> b >> c;
        return std::make_shared<Triangle>(a, b, c);
    }
    else if (name == "CIRCLE") {
        double r;
        input >> r;
        return std::make_shared<Circle>(r);
    }
    return 0;
}