#include <iostream>
struct complex_data
{
constexpr complex_data(double re, double im = 0) : re(re), im(im) {}
double re = 0; // real part
double im = 0; // immaginary part
};
constexpr complex_data operator"" _i(unsigned long long d) { return complex_data{ 0.0, static_cast<double>(d) }; }
constexpr complex_data operator+(const complex_data& lhs, const complex_data& rhs)
{
return complex_data{ lhs.re + rhs.re, lhs.im + rhs.im };
}
std::ostream& operator<<(std::ostream& os, const complex_data& c) { return os << c.re << " + " << c.im << "i"; }
int main()
{
complex_data c = 3 + 2_i;
std::cout << c << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IGNvbXBsZXhfZGF0YQp7CiAgICBjb25zdGV4cHIgY29tcGxleF9kYXRhKGRvdWJsZSByZSwgZG91YmxlIGltID0gMCkgOiByZShyZSksIGltKGltKSB7fQoKICAgIGRvdWJsZSByZSA9IDA7IC8vIHJlYWwgcGFydAogICAgZG91YmxlIGltID0gMDsgLy8gaW1tYWdpbmFyeSBwYXJ0Cn07Cgpjb25zdGV4cHIgY29tcGxleF9kYXRhIG9wZXJhdG9yIiIgX2kodW5zaWduZWQgbG9uZyBsb25nIGQpIHsgcmV0dXJuIGNvbXBsZXhfZGF0YXsgMC4wLCBzdGF0aWNfY2FzdDxkb3VibGU+KGQpIH07IH0KCmNvbnN0ZXhwciBjb21wbGV4X2RhdGEgb3BlcmF0b3IrKGNvbnN0IGNvbXBsZXhfZGF0YSYgbGhzLCBjb25zdCBjb21wbGV4X2RhdGEmIHJocykKewogICAgcmV0dXJuIGNvbXBsZXhfZGF0YXsgbGhzLnJlICsgcmhzLnJlLCBsaHMuaW0gKyByaHMuaW0gfTsKfQoKc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IGNvbXBsZXhfZGF0YSYgYykgeyByZXR1cm4gb3MgPDwgYy5yZSA8PCAiICsgIiA8PCBjLmltIDw8ICJpIjsgfQoKaW50IG1haW4oKQp7CiAgICBjb21wbGV4X2RhdGEgYyA9IDMgKyAyX2k7CgogICAgc3RkOjpjb3V0IDw8IGMgPDwgc3RkOjplbmRsOwp9Cg==