#include <iostream>
#include <vector>
#include <map>
#include <list>
#include <set>
#include <type_traits>
#include<tuple>
template <typename> struct prank : std::integral_constant<std::size_t, 0> {};
template <template <typename...> class C, typename ...Args>
struct prank<C<Args...>>
: std::integral_constant<
std::size_t,
1 + prank<typename C<Args...>::value_type>::value> {};
template <typename U, typename V>
struct prank<std::pair<U, V>>
: std::integral_constant<std::size_t, 1 + prank<V>::value> {};
template <typename... Args>
struct prank<std::tuple<Args...>>
: std::integral_constant<std::size_t, 1> {};
template <typename T,typename... Args>
struct prank<std::tuple<T,Args...>>
: std::integral_constant<std::size_t, prank<T>::value+prank<std::tuple<Args...>>::value> {};
int main()
{
{
using T = std::vector<std::set<std::list<int>>>;
std::cout << prank<T>::value << "\n";
}
{
using T =std::tuple<std::map<std::list<int>,std::list<int>>,std::list<int>,std::list<int>,std::list<int>>;
std::cout << prank<T>::value << "\n";
}
{
using T = std::vector<std::map<std::list<int>,std::list<int>>>;
std::cout << prank<T>::value << "\n";
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPHNldD4KI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgojaW5jbHVkZTx0dXBsZT4KCnRlbXBsYXRlIDx0eXBlbmFtZT4gc3RydWN0IHByYW5rIDogc3RkOjppbnRlZ3JhbF9jb25zdGFudDxzdGQ6OnNpemVfdCwgMD4ge307Cgp0ZW1wbGF0ZSA8dGVtcGxhdGUgPHR5cGVuYW1lLi4uPiBjbGFzcyBDLCB0eXBlbmFtZSAuLi5BcmdzPgpzdHJ1Y3QgcHJhbms8QzxBcmdzLi4uPj4KOiBzdGQ6OmludGVncmFsX2NvbnN0YW50PAogICAgc3RkOjpzaXplX3QsCiAgICAxICsgcHJhbms8dHlwZW5hbWUgQzxBcmdzLi4uPjo6dmFsdWVfdHlwZT46OnZhbHVlPiB7fTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBVLCB0eXBlbmFtZSBWPgpzdHJ1Y3QgcHJhbms8c3RkOjpwYWlyPFUsIFY+Pgo6IHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8c3RkOjpzaXplX3QsIDEgKyBwcmFuazxWPjo6dmFsdWU+IHt9OwoKdGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ3M+CnN0cnVjdCBwcmFuazxzdGQ6OnR1cGxlPEFyZ3MuLi4+Pgo6IHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8c3RkOjpzaXplX3QsIDE+IHt9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsdHlwZW5hbWUuLi4gQXJncz4Kc3RydWN0IHByYW5rPHN0ZDo6dHVwbGU8VCxBcmdzLi4uPj4KOiBzdGQ6OmludGVncmFsX2NvbnN0YW50PHN0ZDo6c2l6ZV90LCBwcmFuazxUPjo6dmFsdWUrcHJhbms8c3RkOjp0dXBsZTxBcmdzLi4uPj46OnZhbHVlPiB7fTsKCmludCBtYWluKCkKewogICAgewogICAgICAgIHVzaW5nIFQgPSBzdGQ6OnZlY3RvcjxzdGQ6OnNldDxzdGQ6Omxpc3Q8aW50Pj4+OwogICAgICAgIHN0ZDo6Y291dCA8PCBwcmFuazxUPjo6dmFsdWUgPDwgIlxuIjsKICAgIH0KICAgIHsKICAgICAgICB1c2luZyBUID1zdGQ6OnR1cGxlPHN0ZDo6bWFwPHN0ZDo6bGlzdDxpbnQ+LHN0ZDo6bGlzdDxpbnQ+PixzdGQ6Omxpc3Q8aW50PixzdGQ6Omxpc3Q8aW50PixzdGQ6Omxpc3Q8aW50Pj47CiAgICAgICAgc3RkOjpjb3V0IDw8IHByYW5rPFQ+Ojp2YWx1ZSA8PCAiXG4iOwogICAgfQogICAgewogICAgICAgIHVzaW5nIFQgPSBzdGQ6OnZlY3RvcjxzdGQ6Om1hcDxzdGQ6Omxpc3Q8aW50PixzdGQ6Omxpc3Q8aW50Pj4+OwogICAgICAgIHN0ZDo6Y291dCA8PCBwcmFuazxUPjo6dmFsdWUgPDwgIlxuIjsKICAgIH0KfQo=