Language: C++

#include <cmath>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
// ------ Classes ------ //
class Point {
public:
	long double px, py;
	Point() : px(0), py(0) {};
	Point(long double px_, long double py_) : px(px_), py(py_) {};
	friend bool operator==(const Point& p1, const Point& p2) { return p1.px == p2.px && p1.py == p2.py; }
	friend bool operator!=(const Point& p1, const Point& p2) { return p1.px != p2.px || p1.py != p2.py; }
	friend bool operator<(const Point& p1, const Point& p2) { return p1.px < p2.px ? true : (p1.px == p2.px && p1.py < p2.py); }
	friend bool operator>(const Point& p1, const Point& p2) { return p1.px > p2.px ? true : (p1.px == p2.px && p1.py > p2.py); }
	friend bool operator<=(const Point& p1, const Point& p2) { return !(p1 > p2); }
	friend bool operator>=(const Point& p1, const Point& p2) { return !(p1 < p2); }
	friend Point operator+(const Point& p1, const Point& p2) { return Point(p1.px + p2.px, p1.py + p2.py); }
	friend Point operator-(const Point& p1, const Point& p2) { return Point(p1.px - p2.px, p1.py - p2.py); }
	friend Point operator*(const Point& p1, long double d) { return Point(p1.px * d, p1.py + d); }
	friend Point operator*(long double d, const Point& p1) { return p1 * d; }
	friend Point operator/(const Point& p1, long double d) { return Point(p1.px / d, p1.py / d); }
	Point& operator+=(const Point& p1) { px += p1.px; py += p1.py; return *this; }
	Point& operator-=(const Point& p1) { px -= p1.px; py -= p1.py; return *this; }
	Point& operator*=(long double d) { px *= d; py *= d; return *this; }
	Point& operator/=(long double d) { px /= d; py /= d; return *this; }
};
class Segment {
public:
	Point p1, p2;
	Segment() : p1(Point()), p2(Point()) {};
	Segment(Point p1_, Point p2_) : p1(p1_), p2(p2_) {};
	Segment(long double p1x, long double p1y, long double p2x, long double p2y) : p1(Point(p1x, p1y)), p2(Point(p2x, p2y)) {};
	friend bool operator==(const Segment& s1, const Segment& s2) { return (s1.p1 == s2.p1 && s1.p2 == s2.p2) || (s1.p1 == s2.p2 && s1.p2 == s2.p1); }
	friend bool operator!=(const Segment& s1, const Segment& s2) { return !(s1 == s2); }
};
class Circle {
public:
	Point p; long double r;
	Circle() : p(Point()), r(0.0L) {};
	Circle(Point p_) : p(p_), r(0.0L) {};
	Circle(Point p_, long double r_) : p(p_), r(r_) {};
	Circle(long double x_, long double y_) : p(Point(x_, y_)), r(0.0L) {};
	Circle(long double x_, long double y_, long double r_) : p(Point(x_, y_)), r(r_) {};
	friend bool operator==(const Circle& c1, const Circle& c2) { return c1.p == c2.p && c1.r == c2.r; }
	friend bool operator!=(const Circle& c1, const Circle& c2) { return !(c1 == c2); }
};
// ------ Functions ------ //
long double norm(const Point& a) { return a.px * a.px + a.py * a.py; }
long double abs(const Point& a) { return sqrtl(norm(a)); }
long double arg(const Point& a) { return atan2l(a.py, a.px); }
long double dot(const Point& a, const Point& b) { return a.px * b.px + a.py * b.py; }
long double crs(const Point& a, const Point& b) { return a.px * b.py - a.py * b.px; }
Point pol(long double r, long double d) { return Point(cosl(d) * r, sinl(d) * r); }
Point prj(const Segment& a, const Point& b) { return a.p1 + (a.p2 - a.p1) * dot(b - a.p1, a.p2 - a.p1) / norm(a.p2 - a.p1); }
Point prj(const Line& a, const Point& b) { return a.p1 + (a.p2 - a.p1) * dot(b - a.p1, a.p2 - a.p1) / norm(a.p2 - a.p1); }
Point rfl(const Segment& a, const Point& b) { return b + (prj(a, b) - b) * 2.0L; }
Point rfl(const Line& a, const Point& b) { return b + (prj(a, b) - b) * 2.0L; }
int ccw(Point p0, Point p1, Point p2) {
	Point a = p1 - p0, b = p2 - p0;
	if (crs(a, b) > 1e-10) return 1;
	if (crs(a, b) < -1e-10) return -1;
	if (dot(a, b) < -1e-10) return 2;
	if (norm(a) < norm(b)) return -2;
	return 0;
}
long double dst(const Point& a, const Point& b) {
	return sqrtl((a.px - b.px) * (a.px - b.px) + (a.py - b.py) * (a.py - b.py));
}
long double dst(const Line& a, const Point& b) {
	return abs(crs(a.p2 - a.p1, b - a.p1) / abs(a.p2 - a.p1));
}
long double dst(const Segment& a, const Point& b) {
	if (dot(a.p2 - a.p1, b - a.p1) < 0.0) return abs(b - a.p1);
	if (dot(a.p1 - a.p2, b - a.p2) < 0.0) return abs(b - a.p2);
	return abs(crs(a.p2 - a.p1, b - a.p1) / abs(a.p2 - a.p1));
}
long double dst(const Segment& a, const Segment& b) {
	if (its(a, b)) return 0;
	return min( { dst(a, b.p1), dst(a, b.p2), dst(b, a.p1), dst(b, a.p2) });
}
int contain(vector<Point> v, Point p) {
	bool in = false;
	for (int i = 0; i < v.size(); ++i) {
		Point a = v[i] - p, b = v[(i + 1) % v.size()] - p;
		if (a.py > b.py) swap(a, b);
		if (a.py <= 0 && 0 < b.py)
			if (crs(a, b) < 0) in = !in;
		if (crs(a, b) == 0 && dot(a, b) <= 0) return 1;
	}
	return in ? 2 : 0;
}
// ------ Main ------ //
Point p1, p2, p3; Segment l1, l2, l3; Circle c;
int main() {
	while(cin >> p1.px >> p1.py >> p2.px >> p2.py >> p3.px >> p3.py >> c.p.px >> c.p.py >> c.r) {
		l1 = Segment(p1, p2);
		l2 = Segment(p2, p3);
		l3 = Segment(p3, p1);
		if(dst(p1, c.p) <= c.r && dst(p2, c.p) <= c.r && dst(p3, c.p) <= c.r) printf("b\n");
		else if(dst(l1, c.p) >= c.r && dst(l2, c.p) >= c.r && dst(l3, c.p) >= c.r) printf(contain({p1, p2, p3}, c.p) ? "a\n" : "d\n");
		else printf("c\n");
	}
}

Compiler output:
a.cc:56:17: error: 'Line' does not name a type
   56 | Point prj(const Line& a, const Point& b) { return a.p1 + (a.p2 - a.p1) * dot(b - a.p1, a.p2 - a.p1) / norm(a.p2 - a.p1); }
      |                 ^~~~
a.cc: In function 'Point prj(const int&, const Point&)':
a.cc:56:53: error: request for member 'p1' in 'a', which is of non-class type 'const int'
   56 | Point prj(const Line& a, const Point& b) { return a.p1 + (a.p2 - a.p1) * dot(b - a.p1, a.p2 - a.p1) / norm(a.p2 - a.p1); }
      |                                                     ^~
a.cc:56:61: error: request for member 'p2' in 'a', which is of non-class type 'const int'
   56 | Point prj(const Line& a, const Point& b) { return a.p1 + (a.p2 - a.p1) * dot(b - a.p1, a.p2 - a.p1) / norm(a.p2 - a.p1); }
      |                                                             ^~
a.cc:56:68: error: request for member 'p1' in 'a', which is of non-class type 'const int'
   56 | Point prj(const Line& a, const Point& b) { return a.p1 + (a.p2 - a.p1) * dot(b - a.p1, a.p2 - a.p1) / norm(a.p2 - a.p1); }
      |                                                                    ^~
a.cc:56:84: error: request for member 'p1' in 'a', which is of non-class type 'const int'
   56 | Point prj(const Line& a, const Point& b) { return a.p1 + (a.p2 - a.p1) * dot(b - a.p1, a.p2 - a.p1) / norm(a.p2 - a.p1); }
      |                                                                                    ^~
a.cc:56:90: error: request for member 'p2' in 'a', which is of non-class type 'const int'
   56 | Point prj(const Line& a, const Point& b) { return a.p1 + (a.p2 - a.p1) * dot(b - a.p1, a.p2 - a.p1) / norm(a.p2 - a.p1); }
      |                                                                                          ^~
a.cc:56:97: error: request for member 'p1' in 'a', which is of non-class type 'const int'
   56 | Point prj(const Line& a, const Point& b) { return a.p1 + (a.p2 - a.p1) * dot(b - a.p1, a.p2 - a.p1) / norm(a.p2 - a.p1); }
      |                                                                                                 ^~
a.cc:56:110: error: request for member 'p2' in 'a', which is of non-class type 'const int'
   56 | Point prj(const Line& a, const Point& b) { return a.p1 + (a.p2 - a.p1) * dot(b - a.p1, a.p2 - a.p1) / norm(a.p2 - a.p1); }
      |                                                                                                              ^~
a.cc:56:117: error: request for member 'p1' in 'a', which is of non-class type 'const int'
   56 | Point prj(const Line& a, const Point& b) { return a.p1 + (a.p2 - a.p1) * dot(b - a.p1, a.p2 - a.p1) / norm(a.p2 - a.p1); }
      |                                                                                                                     ^~
a.cc: At global scope:
a.cc:58:17: error: 'Line' does not name a type
   58 | Point rfl(const Line& a, const Point& b) { return b + (prj(a, b) - b) * 2.0L; }
      |                 ^~~~
a.cc:70:23: error: 'Line' does not name a type
   70 | long double dst(const Line& a, const Point& b) {
      |                       ^~~~
a.cc: In function 'long double dst(const int&, const Point&)':
a.cc:71:26: error: request for member 'p2' in 'a', which is of non-class type 'const int'
   71 |         return abs(crs(a.p2 - a.p1, b - a.p1) / abs(a.p2 - a.p1));
      |                          ^~
a.cc:71:33: error: request for member 'p1' in 'a', which is of non-class type 'const int'
   71 |         return abs(crs(a.p2 - a.p1, b - a.p1) / abs(a.p2 - a.p1));
      |                                 ^~
a.cc:71:43: error: request for member 'p1' in 'a', which is of non-class type 'const int'
   71 |         return abs(crs(a.p2 - a.p1, b - a.p1) / abs(a.p2 - a.p1));
      |                                           ^~
a.cc:71:55: error: request for member 'p2' in 'a', which is of non-class type 'const int'
   71 |         return abs(crs(a.p2 - a.p1, b - a.p1) / abs(a.p2 - a.p1));
      |                                                       ^~
a.cc:71:62: error: request for member 'p1' in 'a', which is of non-class type 'const int'
   71 |         return abs(crs(a.p2 - a.p1, b - a.p1) / abs(a.p2 - a.p1));
      |                                                              ^~
a.cc: In function 'long double dst(const Segment&, const Segment&)':
a.cc:79:13: error: 'its' was not declared in this scope
   79 |         if (its(a, b)) return 0;
      |             ^~~