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

using std::string, std::shared_ptr, std::istringstream;

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

class Rect: public Figure {
 public:
  double a, b;
  Rect(double a, double b) {
    this->a = a;
    this->b = b;
  }
  string Name() override {
    return "RECT";
  }
  double Perimeter() override {
    return 2.0*a+2.0*b;
  }
  double Area() override {
    return a*b;
  }
};

class Triangle: public Figure {
  double a, b, c;
 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 {
    double p = (a+b+c)/2;
    return sqrt(p*(p-a)*(p-b)*(p-c));
  }
};

class Circle: public Figure {
  double r;
 public:
  explicit 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;
  }
};

shared_ptr<Figure> CreateFigure(istringstream &is) {
  string figure;
  double a, b, c;
  is >> figure >> a;
  switch (figure[0]) {
    case 'R':
      is >> b;
      return shared_ptr<Figure>(new Rect(a, b));
      break;
    case 'T':
      is >> b >> c;
      return shared_ptr<Figure>(new Triangle(a, b, c));
      break;
    case 'C':
      return shared_ptr<Figure>(new Circle(a));
      break;
  }
}