#include <iostream>
#include <set>
#include <cmath>
#include <vector>
#include <algorithm>
#include <typeinfo>
#include <map>
using namespace std;
template<typename... T>
struct collection_traits { using template_type = void; };
template<template<typename...> class C, typename... Args>
struct collection_traits<C<Args...> > {
template<typename... Subst>
using template_type = C<Subst...>;
};
template<typename a, typename b, typename c>
struct A {
using a1 = a;
using b1 = b;
using c1 = c;
};
int main(int argc, char *argv[]) {
collection_traits<vector<int>>::template_type<double> t;
collection_traits<map<int, int>>::template_type<string, string> t2;
collection_traits<set<int>>::template_type<double> t3;
collection_traits<A<int, int, int>>::template_type<string, string, string> t4;
cout << typeid(t).name() << endl;
cout << typeid(t2).name() << endl;
cout << typeid(t3).name() << endl;
cout << typeid(t4).name() << endl;
t.push_back(123.5);
t2["ASD"] = "QWE";
cout << t.front() << endl;
for (auto e : t2)
cout << e.first << " " << e.second << endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDx0eXBlaW5mbz4KI2luY2x1ZGUgPG1hcD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBUPgpzdHJ1Y3QgY29sbGVjdGlvbl90cmFpdHMgeyB1c2luZyB0ZW1wbGF0ZV90eXBlID0gdm9pZDsgfTsKCnRlbXBsYXRlPHRlbXBsYXRlPHR5cGVuYW1lLi4uPiBjbGFzcyBDLCB0eXBlbmFtZS4uLiBBcmdzPgpzdHJ1Y3QgY29sbGVjdGlvbl90cmFpdHM8QzxBcmdzLi4uPiA+IHsKICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBTdWJzdD4KICB1c2luZyB0ZW1wbGF0ZV90eXBlID0gQzxTdWJzdC4uLj47Cn07CgoKdGVtcGxhdGU8dHlwZW5hbWUgYSwgdHlwZW5hbWUgYiwgdHlwZW5hbWUgYz4Kc3RydWN0IEEgewogIHVzaW5nIGExID0gYTsKICB1c2luZyBiMSA9IGI7CiAgdXNpbmcgYzEgPSBjOwp9OwoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewogIGNvbGxlY3Rpb25fdHJhaXRzPHZlY3RvcjxpbnQ+Pjo6dGVtcGxhdGVfdHlwZTxkb3VibGU+IHQ7CiAgY29sbGVjdGlvbl90cmFpdHM8bWFwPGludCwgaW50Pj46OnRlbXBsYXRlX3R5cGU8c3RyaW5nLCBzdHJpbmc+IHQyOwogIGNvbGxlY3Rpb25fdHJhaXRzPHNldDxpbnQ+Pjo6dGVtcGxhdGVfdHlwZTxkb3VibGU+IHQzOwogIGNvbGxlY3Rpb25fdHJhaXRzPEE8aW50LCBpbnQsIGludD4+Ojp0ZW1wbGF0ZV90eXBlPHN0cmluZywgc3RyaW5nLCBzdHJpbmc+IHQ0OwoKICBjb3V0IDw8IHR5cGVpZCh0KS5uYW1lKCkgPDwgZW5kbDsKICBjb3V0IDw8IHR5cGVpZCh0MikubmFtZSgpIDw8IGVuZGw7CiAgY291dCA8PCB0eXBlaWQodDMpLm5hbWUoKSA8PCBlbmRsOwogIGNvdXQgPDwgdHlwZWlkKHQ0KS5uYW1lKCkgPDwgZW5kbDsKCiAgdC5wdXNoX2JhY2soMTIzLjUpOwogIHQyWyJBU0QiXSA9ICJRV0UiOwogIGNvdXQgPDwgdC5mcm9udCgpIDw8IGVuZGw7CiAgCiAgZm9yIChhdXRvIGUgOiB0MikKICAgIGNvdXQgPDwgZS5maXJzdCA8PCAiICIgPDwgZS5zZWNvbmQgPDwgZW5kbDsKCn0KCgo=