#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) {
        one = a;
        two = b;
        three = c;
    }

    string Name() {
        return "TRIANGLE";
    }

    double Perimeter() {
        int x = one + two + three;
        return x;
    }

    double Area() {
        double P = (one + two + three);
        P = P / 2.0;
        P = sqrt(P * (P - one) * (P - two) * (P - three));
        return P;
    }

 private:
    int one, two, three;
};

class Rect : public Figure {
 public:
    Rect(const int& a, const int& b) {
        one = a;
        two = b;
    }

    string Name() {
        return "RECT";
    }

    double Perimeter() {
        int x = (one + two) * 2;
        return x;
    }

    double Area() {
        int x = one * two;
        return x;
    }

 private:
    int one, two;
};

class Circle : public Figure {
 public:
    explicit Circle(const int& a) {
        r = a;
    }

    string Name() {
        return "CIRCLE";
    }

    double Perimeter() {
        int x = 2 * 3.14 * r
        return x;
    }

    double Area() {
        int x = 3.14 * r * r;
        return x;
    }

 private:
    int r;
};

std::shared_ptr<Figure> CreateFigure(std::istringstream& is) {
    std::string figure;
    is >> figure;

    if (figure == "RECT") {
        int one, two;
        is >> one >> std::ws >> two;
        return std::make_shared<Rect>(one, two);
    } else if (fig == "TRIANGLE") {
        int one, two, three;
        is >> one >> std::ws >> two >> std::ws >> three;
        return std::make_shared<Triangle>(one, two, three);
    } else {
        int one;
        is >> one;
        return std::make_shared<Circle>(one);
    }
}