#include <iostream>
#include <string>
#include <vector>
#include <functional>

using namespace std;

class Dept;

class Company
{
	string name;
	vector<reference_wrapper<Dept>> depts;
public:
	Company( string name ) : name(name) {}
	void addDept( Dept &d ) { depts.push_back(d); }
};

class President
{
	string name;
	Company &comp;
public:
	President( string name, Company &comp ) : name(name), comp(comp) {}
};

class Manager;
class Employee;

class Dept
{
	string name;
	Company &comp;
	vector<reference_wrapper<Manager>> mgrs;
	vector<reference_wrapper<Employee>> emps;
public:
	Dept( string name, Company &comp ) : name(name), comp(comp) { comp.addDept(*this); }
	void addManager( Manager& m ) { mgrs.push_back( m ); }
	void addEmp( Employee &e ) { emps.push_back( e ); }
};

class Manager
{
	string name;
	Dept &dept;
	vector< reference_wrapper<Employee>> emps;
public:
	Manager(string name, Dept& dept):name(name), dept(dept) { dept.addManager(*this); }
	void supervise( Employee &e ) { emps.push_back(e); }
};

class Employee
{
	string name;
	Dept &dept;
	Manager &mgr;
public:
	Employee( string name, Dept &d, Manager &m ) : name(name), dept(d), mgr(m)
	{ dept.addEmp(*this); mgr.supervise(*this); }
};

int main()
{
	Company nhn("Naver");
	President pr("Shin", nhn);
	Dept hr("HR dept", nhn );
	Dept sales("Sales dept", nhn);
	Manager m1("Kim", hr);
	Manager m2("Lee", sales);
	Employee e1("Kang", hr, m1);
	Employee e2("Ahn", sales, m2);

}