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

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

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

  virtual int Perimeter() const {
    return 0;
  }

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

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

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

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

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

 private:
  int w, h;
};

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

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

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

  int 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";
  }

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

  int Area() const override {
    float p = (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));
}