#include <string>
#include <memory>

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

class Triangle : public Figure {
 public:
    Triangle(const int& A, const int& B, const 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.0;
        return sqrt(p * (p - a) * (p - b) * (p - c));
    }
 private:
    int a, b, c;
};

class Rect : public Figure {
 public:
    Rect(const int& width, const int& hight) {
        a = width;
        b = height;
    }
    std::string Name() {
        return "RECT";
    }
    double Perimeter() {
        return 2.0 * (a + b);
    }
    double Area() {
        return a * b;
    }
 private:
    int a, b;
};

class Circle : public Figure {
 public:
    explicit Circle(const int& radius) {
        a = radius;
    }
    std::string Name() {
        return "CIRCLE";
    }
    double Perimeter() {
        return 2 * 3.14 * a;
    }
    double Area() {
        return 3.14 * a * a;
    }
 private:
    int a;
};

std::shared_ptr<Figure> CreateFigure(std::istringstream& is) {
    std::string figure;
    is >> figure;
    if (figure == "RECT") {
        int a, b;
        is >> a >> std::ws >> b;
        return std::make_shared<Rect>(a, b);
    } else if (figure == "TRIANGLE") {
        int a, b, c;
        is >> a >> std::ws >> b >> std::ws >> c;
        return std::make_shared<Triangle>(a, b, c);
    } else {
        int a;
        is >> a;
        return std::make_shared<Circle>(a);
    }
};