#include <cstddef>
#include <iostream>
using namespace std;
template <class T>
class SharedPtr {
private:
T* _ptr{nullptr};
size_t* _cnt{nullptr};
public:
SharedPtr() = default;
explicit SharedPtr(T* p) : _ptr(p), _cnt(new size_t(p ? 1 : 0)) {}
SharedPtr(const SharedPtr& other) : _ptr(other._ptr), _cnt(other._cnt) {
if (_ptr) ++(*_cnt);
}
SharedPtr& operator=(const SharedPtr& other) {
if (this != &other) {
if (_ptr && --(*_cnt) == 0) {
delete _ptr;
delete _cnt;
}
_ptr = other._ptr;
_cnt = other._cnt;
if (_ptr) ++(*_cnt);
}
return *this;
}
~SharedPtr() {
if (_ptr && --(*_cnt) == 0) {
delete _ptr;
delete _cnt;
}
}
size_t useCnt() const {return _cnt ? *_cnt : 0;}
T* get() const {return _ptr;}
T* operator->() const {return _ptr;}
T& operator*() const {return *_ptr;}
};
class Student {
private:
int _id;
int _age;
public:
Student() = default;
Student(int id, int age) : _id(id), _age(age) {}
int getId() const {
return _id;
}
int getAge() const {
return _age;
}
};
void print(const SharedPtr<Student>& stu) {
cout << stu->getId() << " " << stu->getAge() << " " << stu.useCnt() << endl;
}
int main() {
int t;
cin >> t;
int n;
cin >> n;
string operation;
SharedPtr<Student> sp;
for (int j = 0; j < t; j ++) {
for (int i = 0; i < n; i++) {
cin >> operation;
if (operation == "new") {
int id, age;
cin >> id >> age;
sp = SharedPtr<Student>(new Student(id, age));
} else if (operation == "copy") {sp = SharedPtr<Student>(sp);}
else if (operation == "print") {print(sp);}
}
}
return 0;
}