Lưu Trữ Phiên Bản Dữ Liệu

Xem dưới dạng PDF

Gửi bài giải


Điểm: 15
Giới hạn thời gian: 2.0s
Giới hạn bộ nhớ: 256M
đầu vào: stdin
Đầu ra: stdout

Tác giả:
Kiểu bài tập

Một hệ thống quản lý dữ liệu phân tán hỗ trợ phiên bản hóa (versioning). Ban đầu có \(N\) phần tử, mỗi phần tử là một nhóm riêng biệt — đây là phiên bản \(0\).

Mỗi thao tác gộp nhóm tạo ra một phiên bản mới có số thứ tự tăng dần. Hệ thống cho phép quay lui về bất kỳ phiên bản cũ nào và tiếp tục thao tác từ đó — tương tự git checkout.

\(Q\) thao tác:

  • 1 u v — Gộp nhóm chứa \(u\) và nhóm chứa \(v\) tại phiên bản hiện tại. Tạo phiên bản mới (số phiên bản tăng thêm 1). Nếu \(u\) và \(v\) đã cùng nhóm, không tạo phiên bản mới.
  • 2 k — Quay về phiên bản \(k\), loại bỏ toàn bộ thao tác từ phiên bản \(k+1\) trở đi. Đảm bảo \(0 \le k \le\) số phiên bản hiện tại.
  • 3 u v — Tại phiên bản hiện tại, \(u\) và \(v\) có cùng nhóm không? In YES hoặc NO.

Định dạng đầu vào

  • Dòng 1: Hai số nguyên \(N\) và \(Q\) (\(1 \le N, Q \le 10^5\)).
  • \(Q\) dòng tiếp theo, mỗi dòng là một thao tác như mô tả.

Định dạng đầu ra

Với mỗi thao tác 3 u v, in YES hoặc NO trên một dòng riêng.

Ví dụ

Input:

4 8
1 1 2
1 3 4
3 1 3
2 1
3 1 3
1 1 3
3 1 3
2 0

Output:

NO
NO
YES

Giải thích:

  • 1 1 2: gộp {1,2} → phiên bản 1.
  • 1 3 4: gộp {3,4} → phiên bản 2.
  • 3 1 3: phiên bản 2, nhóm {1,2} và {3,4} khác nhau → NO.
  • 2 1: quay về phiên bản 1 (chỉ có nhóm {1,2}, số phiên bản hiện tại = 1).
  • 3 1 3: phiên bản 1, {1,2} và {3} khác nhau → NO.
  • 1 1 3: gộp {1,2} và {3} → phiên bản 2 (mới, ghi đè).
  • 3 1 3: phiên bản 2, cùng nhóm → YES.
  • 2 0: quay về phiên bản 0 (ban đầu, mọi phần tử đều riêng lẻ).

Ràng buộc

Nhóm \(N\) \(Q\)
1 (30%) \(\le 10^3\) \(\le 10^3\)
2 (70%) \(\le 10^5\) \(\le 10^5\)

\(1 \le u, v \le N\). Với thao tác 2 k: \(0 \le k \le\) số phiên bản hiện tại.


Nhận xét

Không có ý kiến tại thời điểm này.