canuc80k1700·1/50

Giá Trị Thấp Nhất

Nộp bài trên LQDOJ

Bài 17 · Segment Tree

Một dãy gồm ô lưu trữ được đánh số từ đến . Giá trị trong một ô có thể được thay đổi bất kỳ lúc nào. Bạn cần xử lý lần lượt hai loại yêu cầu:

  • : gán giá trị của ô bằng ;
  • : tìm giá trị nhỏ nhất trong các ô có chỉ số từ đến , kể cả hai đầu.

Mỗi yêu cầu được thực hiện trên trạng thái của dãy sau tất cả yêu cầu trước đó.

Input

  • Dòng đầu chứa hai số nguyên và .
  • Dòng thứ hai chứa số nguyên - các giá trị ban đầu.
  • Mỗi dòng trong dòng tiếp theo mô tả một yêu cầu theo một trong hai dạng hoặc .

Output

  • Với mỗi yêu cầu loại , in ra một dòng chứa giá trị nhỏ nhất trong đoạn .

Constraints

  • .
  • .
  • Với yêu cầu loại : .
  • Với yêu cầu loại : .

Scoring

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

Example

Test 1

Input

5 6
7 2 9 2 6
2 1 5
1 2 8
2 1 3
1 4 10
2 3 5
2 4 4

Output

2
7
6
10

Giải thích: Ban đầu, giá trị nhỏ nhất của cả dãy là . Sau từng phép gán, ba truy vấn còn lại lần lượt cho kết quả và .

Lời giải tóm tắt
  • Phân tích: Mỗi thao tác gán chỉ làm thay đổi một vị trí, còn một truy vấn cần giá trị nhỏ nhất trên một đoạn bất kỳ. Quét cả đoạn tốn O(n) cho một truy vấn, nên trong trường hợp xấu nhất sẽ quá chậm.
  • Phân tích: Ta xây cây đoạn. Mỗi node lưu giá trị nhỏ nhất của toàn bộ đoạn mà node quản lý. Phần tử trung hòa khi một nhánh không giao với truy vấn là một số dương lớn hơn mọi giá trị hợp lệ.
  • Thuật toán: 1. Xây cây từ mảng ban đầu; giá trị của node cha là minimum của hai node con. 2. Khi gán a[k] = u, đi tới lá tương ứng rồi tính lại các node trên đường về gốc. 3. Khi hỏi [l,r], bỏ qua node không giao, dùng ngay node nằm trọn trong đoạn, và lấy minimum của hai kết quả con ở trường hợp giao một phần.
  • Chứng minh tính đúng đắn: Ta chứng minh rằng sau mỗi thao tác, mỗi node luôn lưu đúng minimum của đoạn nó quản lý. Điều này đúng ở lá. Nếu đúng ở hai con thì minimum của hợp hai đoạn bằng minimum của hai giá trị đã lưu, nên đúng ở cha. Một phép gán sửa đúng một lá và tính lại toàn bộ tổ tiên, do đó bất biến vẫn đúng.
  • Chứng minh tính đúng đắn: Trong truy vấn, các node được dùng tạo thành một phân hoạch không chồng lặp của [l,r]. Minimum của các node ấy vì thế bằng minimum của toàn bộ đoạn cần hỏi. Do đó mọi kết quả được in là đúng.
  • Độ phức tạp: Xây cây trong O(n). Mỗi cập nhật và truy vấn tốn O(log n). Bộ nhớ O(n).