Ban đầu có đỉnh, mỗi đỉnh là một thành phần liên thông riêng. Xử lý lệnh:
- : hợp thành phần chứa với thành phần chứa nếu chúng khác nhau, rồi in số thành phần hiện tại.
persist: đặt một mốc lưu trạng thái hiện tại. Các mốc được quản lý theo ngăn xếp.rollback: khôi phục trạng thái tại mốc gần nhất, xóa mốc đó, rồi in số thành phần hiện tại.
Một lệnh giữa hai đỉnh vốn đã cùng thành phần vẫn là một lệnh hợp lệ và không làm đổi số thành phần.
Input
- Dòng đầu chứa hai số nguyên và .
- Mỗi trong dòng tiếp theo mô tả một lệnh theo một trong ba dạng trên.
Output
- Sau mỗi lệnh và
rollback, in số thành phần liên thông hiện tại trên một dòng riêng. Lệnhpersistkhông tạo đầu ra.
Constraints
- .
- .
- Mỗi lệnh
rollbackluôn có ít nhất một mốc chưa được dùng.
Scoring
- Subtask ( số điểm): .
- Subtask ( số điểm): Không có giới hạn bổ sung.
Example
Test 1
Input
5 8 union 1 2 persist union 2 3 union 1 3 persist union 4 5 rollback rollback
Output
4 3 3 2 3 4
Giải thích: Phép hợp là dư thừa nên số thành phần vẫn là . Hai lần rollback lần lượt xóa hợp , rồi xóa cả các phép hợp sau mốc đầu, đưa số thành phần về và .