#include<bits/stdc++.h>
using namespace std;
#define each(CONTAINER_OUT_OF_LAMBDA,VAR,DOSOMETHING)\
[&](auto CONTAINER) -> decltype(CONTAINER)\
{\
decltype(CONTAINER) Result;\
auto BACKUP = CONTAINER;\
for(decltype(*CONTAINER.begin()) VAR : CONTAINER)\
{\
DOSOMETHING;\
Result.APIINSERT(VAR);\
}\
CONTAINER = BACKUP;\
return Result;\
}\
(CONTAINER_OUT_OF_LAMBDA)
#define which(CONTAINER_OUT_OF_LAMBDA,VAR,CONDITION_OUT_OF_LAMBDA)\
[=](auto CONTAINER)\
-> decltype(CONTAINER)\
{\
decltype(CONTAINER) Result;\
for(decltype(*CONTAINER.begin()) VAR : CONTAINER)\
{\
if(CONDITION_OUT_OF_LAMBDA)\
Result.APIINSERT(VAR);\
}return Result;\
}\
(CONTAINER_OUT_OF_LAMBDA)
#define eachi(CONTAINER_OUT_OF_LAMBDA,VAR,VARINDEX,DOSOMETHING)\
[&](auto CONTAINER) -> decltype(CONTAINER)\
{\
decltype(CONTAINER) Result;\
auto BACKUP = CONTAINER;\
int VARINDEX = 0;\
for(decltype(*CONTAINER.begin()) VAR : CONTAINER)\
{\
DOSOMETHING;\
Result.APIINSERT(VAR);\
VARINDEX ++;\
}\
CONTAINER = BACKUP;\
return Result;\
}\
(CONTAINER_OUT_OF_LAMBDA)
#define whichi(CONTAINER_OUT_OF_LAMBDA,VAR,VARINDEX,CONDITION_OUT_OF_LAMBDA)\
[=](auto CONTAINER)\
-> decltype(CONTAINER)\
{\
decltype(CONTAINER) Result;\
int VARINDEX = 0;\
for(decltype(*CONTAINER.begin()) VAR : CONTAINER)\
{\
if(CONDITION_OUT_OF_LAMBDA)\
Result.APIINSERT(VAR);\
VARINDEX ++;\
}return Result;\
}\
(CONTAINER_OUT_OF_LAMBDA)
struct EXCPP_TYPE_INFO{
uint64_t high,low;
bool operator < (const EXCPP_TYPE_INFO another)const{
if(high != another.high){
return high < another.high;
}
return low < another.low;
}
};
map<EXCPP_TYPE_INFO,void*> READLIB;
template<typename T>
void AddReadSupport(auto READ_FUNCTION){
function<void(T&)> rf = READ_FUNCTION;
function<void(T&)>* pointer = new function<void(T&)>;
*pointer = rf;
READLIB[*((EXCPP_TYPE_INFO*)(&typeid(T&)))] = (void*)(pointer);
}
void APIRead(auto& x){
typedef decltype(x) VarType;
void* rfp = READLIB[*((EXCPP_TYPE_INFO*)(&typeid(VarType)))];
if (rfp == nullptr) {
throw runtime_error("No read function registered for this type.");
}
function<void(VarType x)> rf = *((function<void(VarType x)>*)(rfp));
rf(x);
}
template<typename T>
void read(T& x){
APIRead(x);
return;
}
template<typename T,typename... Args>
void read(T& x,Args&... arg){
APIRead(x);
read(arg...);
}
int main() {
AddReadSupport<int>([](int& x){cin >> x;});
AddReadSupport<string>([](string& x){cin >> x;});
return 0;
}