canuc80k6604·5/15

Kẹp Hai Phía

Nộp bài trên LQDOJ

Bài 66 · Segment Tree Beats

Cho dãy số nguyên . Mọi đoạn trong bài là đoạn nửa mở , gồm các chỉ số . Hỗ trợ:

  • : gán trên đoạn.
  • : gán trên đoạn.
  • : cộng vào mỗi phần tử trên đoạn.
  • : in tổng các phần tử trên đoạn.

Input

  • Dòng đầu chứa và .
  • Dòng thứ hai chứa phần tử ban đầu.
  • dòng tiếp theo mô tả các thao tác theo một trong bốn dạng trên.

Output

  • Với mỗi thao tác loại , in tổng cần tìm trên một dòng.

Constraints

  • .
  • .
  • ; mọi giá trị trung gian và tổng vừa số nguyên bit có dấu.

Scoring

  • Subtask ( số điểm): và mọi giá trị tuyệt đối không vượt trong suốt quá trình.
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

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

Output

16
10
4

Giải thích: Tổng ban đầu là . Sau ba cập nhật đầu, dãy là nên tổng bằng ; hạ hai vị trí cuối theo ngưỡng làm tổng đoạn bằng .

Lời giải tóm tắt
  • Mô hình: Hỗ trợ đồng thời chmin, chmax, cộng và truy vấn tổng trên các đoạn nửa mở.
  • Thuật toán: Mỗi nút lưu hai cực trị đầu, số lượng của chúng, tổng và lazy add. Chmin/chmax chỉ sửa nhóm cực trị khi ngưỡng vượt qua đúng một lớp giá trị.
  • 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+q) log n); bộ nhớ O(n).