This documentation is automatically generated by online-judge-tools/verification-helper
template <class T> class affine {
public:
T a;
T b;
constexpr affine(const T &a = 1, const T &b = 0) noexcept : a(a), b(b) {}
constexpr T evaluate(const T &x) const noexcept { return x * a + b; }
friend constexpr affine operator+(const affine &l, const affine &r) noexcept {
return affine(l.a + r.a, l.b + r.b);
}
constexpr affine composite(const affine &r) const noexcept {
return affine(a * r.a, b * r.a + r.b);
}
};
template <class T> class affine_composite_monoid {
public:
using value_type = affine<T>;
static constexpr value_type operation(const value_type &l,
const value_type &r) noexcept {
return l.composite(r);
}
static constexpr value_type identity{};
};
#line 1 "other/affine.cpp"
template <class T> class affine {
public:
T a;
T b;
constexpr affine(const T &a = 1, const T &b = 0) noexcept : a(a), b(b) {}
constexpr T evaluate(const T &x) const noexcept { return x * a + b; }
friend constexpr affine operator+(const affine &l, const affine &r) noexcept {
return affine(l.a + r.a, l.b + r.b);
}
constexpr affine composite(const affine &r) const noexcept {
return affine(a * r.a, b * r.a + r.b);
}
};
template <class T> class affine_composite_monoid {
public:
using value_type = affine<T>;
static constexpr value_type operation(const value_type &l,
const value_type &r) noexcept {
return l.composite(r);
}
static constexpr value_type identity{};
};