#include <iostream>
#include <string>
#include <memory>
#include <sstream>
#include <cstring>

class Figure {
 public:
  virtual std::string Name() = 0;
  virtual double Perimeter() = 0;
  virtual double Area() = 0;
};
class Triangle : public Figure {
  double a = 0;
  double b = 0;
  double c = 0;
 public:
  Triangle(double a, double b, double c) {
    this->a = a;
    this->b = b;
    this->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));
  }
};
class Rect : public Figure {
 public:
  double width = 0;
  double height = 0;
  Rect(double width, double height) {
    this->width = width;
    this->height = height;
  }
  std::string Name() override {
    return "RECT";
  }
  double Perimeter() override {
    return (width + height) * 2;
  }
  double Area() override {
    return width * height;
  }
};

class Circle : public Figure {
 public:
  double radius = 0;
  explicit Circle(double radius) {
    this->radius = radius;
  }
  std::string Name() override {
    return "CIRCLE";
  }
  double Perimeter() override {
    return 2 * 3.14 * radius;
  }
  double Area() override {
    return 3.14 * radius * radius;
  }
};
static std::shared_ptr<Figure> CreateFigure(std::istringstream &request1) {
  auto request = request1.str();
  request = request.erase(0, request.find(' ') + 1);
  int pos = request.find(' ');
  auto type = request.substr(0, pos);
  request.erase(0, pos + 1);
  if (strcmp(type.c_str(), "RECT") == 0) {
    pos = request.find(' ');
    int width = std::stoi(request.substr(0, pos));
    request.erase(0, pos + 1);
    int height = std::stoi(request);
    std::shared_ptr<Rect> ptr1(new Rect(width, height));
    return ptr1;
  } else if (strcmp(type.c_str(), "CIRCLE") == 0) {
    int radius = std::stoi(request);
    std::shared_ptr<Circle> ptr1(new Circle(radius));
    return ptr1;
  } else if (strcmp(type.c_str(), "TRIANGLE") == 0) {
    pos = request.find(' ');
    int a = std::stoi(request.substr(0, pos));
    request.erase(0, pos + 1);
    pos = request.find(' ');
    int b = std::stoi(request.substr(0, pos));
    request.erase(0, pos + 1);
    int c = std::stoi(request);
    std::shared_ptr<Triangle> ptr1(new Triangle(a, b, c));
    return ptr1;
  }
  return nullptr;
}