canuc80k2400·1/50

Tổng Đoạn Linh Hoạt

Nộp bài trên LQDOJ

Bài 24 · Sqrt Decomposition

Cho một dãy gồm số nguyên. Bạn cần xử lý các phép gán giá trị mới cho một phần tử và các truy vấn tính tổng trên một đoạn liên tiếp. Mọi chỉ số trong đề đều được đánh số từ .

Các thao tác có ý nghĩa như sau:

  • : gán .
  • : in .

Input

  • Dòng đầu chứa hai số nguyên . Dòng thứ hai chứa số nguyên . Mỗi trong dòng tiếp theo mô tả một thao tác theo một trong hai dạng trên.

Output

  • Với mỗi thao tác loại , in tổng các phần tử từ đến , kể cả hai đầu mút.

Constraints

  • .
  • .
  • và .

Scoring

  • Subtask ( điểm): .
  • Subtask ( điểm): không có ràng buộc bổ sung.

Example

Test 1

Input

5 5
2 1 3 4 5
2 2 5
1 3 10
2 1 3
1 5 6
2 4 5

Output

13
13
10

Giải thích: Truy vấn đầu cho tổng . Sau khi gán , tổng đoạn là ; cuối cùng nên tổng là .

Lời giải tóm tắt
  • Ý tưởng: Chia dãy thành các khối gần . Lưu từng phần tử và tổng của mỗi khối. Khi gán một điểm, điều chỉnh tổng khối bằng hiệu giữa giá trị mới và cũ. Khi hỏi đoạn, cộng trực tiếp hai mảnh biên và dùng tổng đã lưu cho các khối nguyên.
  • Chứng minh đúng: Mỗi phần tử thuộc đúng một khối. Phép gán cập nhật đồng thời giá trị và tổng khối nên các tổng khối luôn đúng. Truy vấn phân hoạch đoạn thành các phần tử biên và các khối nguyên không giao nhau, do đó tổng được cộng đúng một lần cho mọi vị trí.
  • Độ phức tạp: cho cập nhật và cho truy vấn; bộ nhớ .