#include <iostream>
#include <tuple>
#include <functional>
#include <type_traits>
#include <stdexcept>
template<bool B>
using Bool = std::integral_constant<bool, B>;
template<typename T>
using EnableIf = typename std::enable_if<T::value>::type;
template<size_t N = 0, class Elem, class Traits, typename... Args, EnableIf<Bool<(N >= sizeof...(Args))>>...>
inline void index_input(std::basic_istream<Elem,Traits>&, const size_t, const std::tuple<Args...>&) {
throw std::out_of_range("Index exceeds number of arguments provided");
}
template<size_t N = 0, class Elem, class Traits, typename... Args, EnableIf<Bool<(N < sizeof...(Args))>>...>
inline void index_input(std::basic_istream<Elem,Traits>& in, const size_t i, const std::tuple<Args...>& tup) {
if(i != N) {
index_input<N + 1>(in, i, tup);
return;
}
using std::get;
in >> get<N>(tup);
}
template<typename CharT, typename Elem, /*size_t N,*/ typename... Args>
void fscan(std::basic_istream<CharT, Elem>& in, const std::basic_string<CharT, Elem>& format, Args&&... args) {
// make a tuple of references
auto tup = std::make_tuple(std::ref(std::forward<Args>(args))...);
auto first = format.cbegin();
auto last = format.cend();
unsigned index = 0;
for(; first != last; ++first) {
if(*first == '%' && ((first + 1) != last || *(first + 1) != '%')) {
// format specifier
index_input(in, index++, tup);
continue;
}
// non-format specifier or parsing error
auto c = in.get();
if(!in || c != *first) {
throw std::runtime_error("error parsing");
break;
}
}
}
int main() {
int x, y;
fscan(std::cin, std::string("% = %"), x, y);
std::cout << x << " = " << y;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHVwbGU+CiNpbmNsdWRlIDxmdW5jdGlvbmFsPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CiNpbmNsdWRlIDxzdGRleGNlcHQ+Cgp0ZW1wbGF0ZTxib29sIEI+CnVzaW5nIEJvb2wgPSBzdGQ6OmludGVncmFsX2NvbnN0YW50PGJvb2wsIEI+OwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KdXNpbmcgRW5hYmxlSWYgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxUOjp2YWx1ZT46OnR5cGU7Cgp0ZW1wbGF0ZTxzaXplX3QgTiA9IDAsIGNsYXNzIEVsZW0sIGNsYXNzIFRyYWl0cywgdHlwZW5hbWUuLi4gQXJncywgRW5hYmxlSWY8Qm9vbDwoTiA+PSBzaXplb2YuLi4oQXJncykpPj4uLi4+CmlubGluZSB2b2lkIGluZGV4X2lucHV0KHN0ZDo6YmFzaWNfaXN0cmVhbTxFbGVtLFRyYWl0cz4mLCBjb25zdCBzaXplX3QsIGNvbnN0IHN0ZDo6dHVwbGU8QXJncy4uLj4mKSB7CiAgICB0aHJvdyBzdGQ6Om91dF9vZl9yYW5nZSgiSW5kZXggZXhjZWVkcyBudW1iZXIgb2YgYXJndW1lbnRzIHByb3ZpZGVkIik7Cn0KCnRlbXBsYXRlPHNpemVfdCBOID0gMCwgY2xhc3MgRWxlbSwgY2xhc3MgVHJhaXRzLCB0eXBlbmFtZS4uLiBBcmdzLCBFbmFibGVJZjxCb29sPChOIDwgc2l6ZW9mLi4uKEFyZ3MpKT4+Li4uPgppbmxpbmUgdm9pZCBpbmRleF9pbnB1dChzdGQ6OmJhc2ljX2lzdHJlYW08RWxlbSxUcmFpdHM+JiBpbiwgY29uc3Qgc2l6ZV90IGksIGNvbnN0IHN0ZDo6dHVwbGU8QXJncy4uLj4mIHR1cCkgewogICAgaWYoaSAhPSBOKSB7CiAgICAgICAgaW5kZXhfaW5wdXQ8TiArIDE+KGluLCBpLCB0dXApOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHVzaW5nIHN0ZDo6Z2V0OwogICAgaW4gPj4gZ2V0PE4+KHR1cCk7Cn0KCnRlbXBsYXRlPHR5cGVuYW1lIENoYXJULCB0eXBlbmFtZSBFbGVtLCAvKnNpemVfdCBOLCovIHR5cGVuYW1lLi4uIEFyZ3M+CnZvaWQgZnNjYW4oc3RkOjpiYXNpY19pc3RyZWFtPENoYXJULCBFbGVtPiYgaW4sIGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPENoYXJULCBFbGVtPiYgZm9ybWF0LCBBcmdzJiYuLi4gYXJncykgewogICAgLy8gbWFrZSBhIHR1cGxlIG9mIHJlZmVyZW5jZXMKICAgIGF1dG8gdHVwID0gc3RkOjptYWtlX3R1cGxlKHN0ZDo6cmVmKHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKSkuLi4pOwogICAgYXV0byBmaXJzdCA9IGZvcm1hdC5jYmVnaW4oKTsKICAgIGF1dG8gbGFzdCA9IGZvcm1hdC5jZW5kKCk7CiAgICB1bnNpZ25lZCBpbmRleCA9IDA7CgogICAgZm9yKDsgZmlyc3QgIT0gbGFzdDsgKytmaXJzdCkgewogICAgICAgIGlmKCpmaXJzdCA9PSAnJScgJiYgKChmaXJzdCArIDEpICE9IGxhc3QgfHwgKihmaXJzdCArIDEpICE9ICclJykpIHsKICAgICAgICAgICAgLy8gZm9ybWF0IHNwZWNpZmllcgogICAgICAgICAgICBpbmRleF9pbnB1dChpbiwgaW5kZXgrKywgdHVwKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICAvLyBub24tZm9ybWF0IHNwZWNpZmllciBvciBwYXJzaW5nIGVycm9yCiAgICAgICAgYXV0byBjID0gaW4uZ2V0KCk7CiAgICAgICAgaWYoIWluIHx8IGMgIT0gKmZpcnN0KSB7CiAgICAgICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiZXJyb3IgcGFyc2luZyIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9Cn0KIAppbnQgbWFpbigpIHsKICAgIGludCB4LCB5OwogICAgZnNjYW4oc3RkOjpjaW4sIHN0ZDo6c3RyaW5nKCIlID0gJSIpLCB4LCB5KTsKICAgIHN0ZDo6Y291dCA8PCB4IDw8ICIgPSAiIDw8IHk7Cn0=