canuc80k6603·4/15

Hạ Trần

Nộp bài trên LQDOJ

Bài 66 · Segment Tree Beats

Cho dãy số nguyên không âm . Hỗ trợ các thao tác trên đoạn đóng :

  • : thay mỗi bằng .
  • : tìm giá trị lớn nhất trên đoạn.
  • : tính tổng các phần tử trên đoạn.

Input

  • Dòng đầu chứa .
  • Dòng thứ hai chứa phần tử ban đầu.
  • Dòng thứ ba chứa số thao tác .
  • dòng sau mô tả các thao tác.

Output

  • Với mỗi thao tác loại hoặc , in kết quả trên một dòng.

Constraints

  • .
  • .
  • ; tổng được tính bằng số nguyên bit.

Scoring

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

Example

Test 1

Input

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

Output

9
31
25
5

Giải thích: Hai truy vấn đầu cho cực đại và tổng . Sau khi hạ đoạn theo ngưỡng , tổng còn ; lần hạ cuối làm đoạn có cực đại .

Lời giải tóm tắt
  • Mô hình: Duy trì dãy qua phép hạ mọi giá trị vượt ngưỡng, đồng thời truy vấn cực đại và tổng đoạn.
  • Thuật toán: Mỗi nút lưu cực đại lớn nhất, cực đại thứ hai, số lần đạt cực đại và tổng. Chmin được áp dụng nguyên nút khi ngưỡng nằm giữa hai cực đại.
  • Thuật toán: Các truy vấn đọc kết quả từ các thống kê đã được duy trì. Mọi thao tác lazy đều được đẩy xuống trước khi tách nút, rồi nút cha được ghép lại từ hai con.
  • Tính đúng đắn: Ta chứng minh bằng quy nạp theo cây. Ở lá, giá trị lưu chính là giá trị hiện tại của phần tử. Ở một nút trong, điều kiện áp dụng nhanh chỉ được dùng khi thống kê của nút chứng minh rằng mọi phần tử chịu cùng một biến đổi; vì vậy cập nhật các trường tổng hợp là chính xác. Nếu điều kiện đó không đúng, thuật toán đẩy tag, xử lý hai con và ghép lại, nên giả thiết quy nạp cho kết quả đúng. Các nhánh bị bỏ qua đều nằm ngoài đoạn hoặc đã được chứng minh là bất biến. Do đó mọi cập nhật và truy vấn đều đúng theo contract.
  • Độ phức tạp: Amortized O((n+m) log n); bộ nhớ O(n).