Cho một mảng a gồm n phần tử, đánh số từ 0 đến n−1. Bạn cần xử lý hai loại thao tác theo đúng thứ tự xuất hiện:
1iv: thay ai bằng v;
2lr: xét đoạn nửa mở[l,r), tức là các vị trí l,l+1,…,r−1. Hãy tìm giá trị nhỏ nhất trong đoạn và số vị trí mang giá trị ấy.
Input
Dòng đầu chứa hai số nguyên n và m - số phần tử và số thao tác.
Dòng thứ hai chứa n số nguyên a0,a1,…,an−1.
Mỗi dòng trong m dòng tiếp theo có dạng 1iv hoặc 2lr.
Output
Với mỗi thao tác loại 2, in hai số trên một dòng: giá trị nhỏ nhất trong [l,r) và số lần giá trị đó xuất hiện trong đoạn.
Constraints
1≤n,m≤105.
0≤ai,v≤109.
Với thao tác loại 1: 0≤i<n.
Với thao tác loại 2: 0≤l<r≤n.
Scoring
Subtask 1 (50% số điểm): n,m≤2000.
Subtask 2 (50% số điểm): Không có giới hạn bổ sung.
Example
Test 1
Input
5 5
4 1 1 3 2
2 0 5
1 2 5
2 0 3
1 0 1
2 0 4
Output
1 2
1 1
1 2
Giải thích: Truy vấn đầu thấy giá trị nhỏ nhất 1 ở hai vị trí. Sau các phép gán, số lần xuất hiện của giá trị nhỏ nhất trong hai đoạn tiếp theo lần lượt là 1 và 2.
Lời giải tóm tắt
Phân tích: Chỉ biết minimum của một đoạn là chưa đủ, vì đề còn hỏi số lần minimum xuất hiện. Mỗi node của cây đoạn vì thế lưu cặp (mn, cnt): mn là giá trị nhỏ nhất và cnt là số phần tử bằng mn trong đoạn của node.
Phân tích: Khi gộp hai node, nếu hai minimum khác nhau thì toàn bộ đáp án đến từ phía có minimum nhỏ hơn. Nếu chúng bằng nhau, minimum chung giữ nguyên và hai tần suất được cộng lại. Node rỗng dùng cặp (vô cùng, 0).
Thuật toán: Xây cây từ các lá (a_i,1).
Thuật toán: Cập nhật điểm thay lá bằng (v,1) rồi gộp lại các tổ tiên.
Thuật toán: Truy vấn [l,r) bằng cách gộp các node phủ đúng đoạn ấy.
Chứng minh tính đúng đắn: Ở mỗi lá, cặp lưu trữ hiển nhiên đúng. Giả sử hai node con đúng. Nếu minimum của chúng khác nhau, không phần tử ở phía có minimum lớn hơn có thể là minimum của đoạn cha; nếu bằng nhau, mọi lần xuất hiện ở cả hai phía đều phải được tính. Do đó phép gộp tạo đúng cặp cho node cha.
Chứng minh tính đúng đắn: Cập nhật duy trì bất biến trên đường từ lá tới gốc. Các node dùng trong truy vấn phân hoạch chính xác [l,r), nên gộp chúng cho đúng minimum và đúng tổng tần suất của minimum. Vì vậy thuật toán luôn in kết quả đúng.
Độ phức tạp: Xây cây O(n), mỗi thao tác O(log n), bộ nhớ O(n).