canuc80k5900·1/30

Dòng Thời Gian Của Mảng

Nộp bài trên LQDOJ

Bài 59 · Persistent Segment Tree

Một mảng gồm phần tử được xem là phiên bản . Sau đó có thao tác, đánh số từ đến ; thao tác thứ luôn tạo ra phiên bản .

Mỗi thao tác chọn một phiên bản đã tồn tại và thuộc một trong hai loại:

  • : phiên bản ban đầu giống phiên bản , sau đó phần tử ở vị trí được đổi thành .
  • : in phần tử ở vị trí của phiên bản ; phiên bản là một bản sao không thay đổi của phiên bản .

Vì thao tác đọc cũng tạo phiên bản, mọi phiên bản từ đến đều có thể được tham chiếu trong các thao tác về sau.

Input

  • Dòng đầu chứa hai số nguyên và .
  • Dòng thứ hai chứa số nguyên , là phiên bản .
  • Mỗi dòng trong dòng tiếp theo mô tả một thao tác theo một trong hai dạng hoặc .

Output

  • Với mỗi thao tác loại , in giá trị được đọc trên một dòng.

Constraints

  • .
  • .
  • .
  • Ở thao tác thứ .

Scoring

  • Subtask ( số điểm): .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

4 6
5 8 2 9
0 2 2
0 1 3 7
2 2 3
1 1 2 -4
4 2 2
2 2 2

Output

8
7
-4
8

Giải thích: Phiên bản đổi vị trí thành , còn phiên bản tách từ phiên bản và đổi vị trí thành . Truy vấn cuối vẫn đọc phiên bản nên nhận ở vị trí , không bị ảnh hưởng bởi nhánh phiên bản .

Lời giải tóm tắt
  • Ý tưởng: Ta lưu mỗi phiên bản bằng chỉ số gốc của một cây đoạn trên miền vị trí [1,n]. Lá lưu giá trị hiện tại của phần tử tương ứng.
  • Ý tưởng: Khi cập nhật vị trí p, chỉ những nút trên đường từ gốc đến lá p có nội dung thay đổi. Ta sao chép đúng các nút này; nhánh không chứa p tiếp tục dùng chung với phiên bản cũ. Vì không nút cũ nào bị sửa, mọi gốc đã tạo vẫn hợp lệ.
  • Ý tưởng: Với thao tác đọc, ta truy vấn một đường từ root[v] đến lá p, rồi đặt root[i] = root[v] để ghi nhận phiên bản mới không thay đổi.
  • Ý tưởng: Đúng đắn. Sau một cập nhật, mọi vị trí khác p dùng lại cây con cũ nên giữ nguyên giá trị; lá p nhận đúng x. Quy nạp theo số thao tác cho thấy mỗi gốc mô tả đúng phiên bản của nó, vì vậy mọi truy vấn trả đúng giá trị được yêu cầu.
  • Ý tưởng: Độ phức tạp. Dựng cây O(n). Mỗi cập nhật và truy vấn tốn O(log n); mỗi cập nhật tạo O(log n) nút mới.