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