namespace omp
{
    public class Point { }

    public class Point3D(int x, int y, int z) : Point
    {
        public int x = x, y = y, z = z;

        public double DistanceTo(Point3D a)
        {
            double dx = x - a.x;
            double dy = y - a.y;
            double dz = z - a.z;

            return Math.Sqrt(dx * dx + dy * dy + dz * dz);
        }

        public bool Equals(Point3D a)
        {
            return (x == a.x) && (y == a.y) && (z == a.z);
        }
    }

    public class Point2D(int x, int y) : Point
    {
        public int x = x, y = y;

        public double DistanceTo(Point2D a)
        {
            double dx = x - a.x;
            double dy = y - a.y;

            return Math.Sqrt(dx * dx + dy * dy);
        }

        public bool Equals(Point2D a)
        {
            return (x == a.x) && (x == a.y);
        }
    }
}
