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

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

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

 private:
  int width_, height_;
};

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

 private:
  int a_, b_, c_;
};

class Circle : public Figure {
 public:
  explicit Circle(int rad): r_(rad) {}
  std::string Name() override {
    return "CIRCLE";
  }
  double Perimeter() override {
    const double PI = 3.14;
    return 2 * PI * r_;
  }
  double Area() override {
    const double PI = 3.14;
    return PI * r_ * r_;
  }
 private:
  int r_;
};

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