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

using std::string;
using std::make_shared;
using std::shared_ptr;
using std::stoi;
using std::istringstream;

class Figure {
 public:
  virtual string Name() const {
    return "FIGURE";
  }

  virtual float Perimeter() const {
    return 0;
  }

  virtual float Area() const {
    return 0;
  }
};

class Rect : public Figure {
 public:
  Rect(int w, int h):
    w(w), h(h) {}

  string Name() const override {
    return "RECT";
  }

  float Perimeter() const override {
    return 2*(w + h);
  }

  float Area() const override {
    return w * h;
  }

 private:
  int w, h;
};

class Circle : public Figure {
 public:
  explicit Circle(int r):
    r(r) {}

  string Name() const override {
    return "CIRCLE";
  }

  float Perimeter() const override {
    return 3.14 * 2 * r;
  }

  float Area() const override {
    return 3.14 * pow(r, 2);
  }

 private:
  int r;
};

class Triangle : public Figure {
 public:
  Triangle(int a, int b, int c):
    a(a), b(b), c(c) {}

  string Name() const override {
    return "TRIANGLE";
  }

  float Perimeter() const override {
    return a + b + c;
  }

  float Area() const override {
    float p = static_cast<float>(this->Perimeter()) / 2;
    int area = sqrt(p*(p-a)*(p-b)*(p-c));
    return area;
  }

 private:
  int a, b, c;
};

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