canuc80k6600·1/15

Căn Bậc Hai Theo Đoạn

Nộp bài trên LQDOJ

Bài 66 · Segment Tree Beats

Cho một dãy số nguyên không âm. Bạn cần xử lý hai loại thao tác trên các đoạn đóng của dãy.

  • Thao tác : với mọi chỉ số từ đến , thay bằng số nguyên lớn nhất thỏa .
  • Thao tác : tính tổng các phần tử trên chính đoạn đó.

Input có thể chứa nhiều bộ dữ liệu nối tiếp nhau và kết thúc ở EOF. Các bộ được đánh số từ .

Input

  • Mỗi bộ dữ liệu có dạng:
  • Dòng đầu chứa số nguyên .
  • Dòng tiếp theo chứa số nguyên .
  • Dòng tiếp theo chứa số nguyên .
  • dòng sau, mỗi dòng chứa ba số nguyên mô tả một thao tác.
  • Không có số lượng bộ dữ liệu ở đầu input; hãy đọc đến hết tệp.

Output

  • Với bộ dữ liệu thứ , in dòng Case #k:. Sau đó, với mỗi thao tác loại , in tổng cần tìm trên một dòng. In thêm một dòng trống sau mỗi bộ dữ liệu.

Constraints

  • cho mỗi bộ dữ liệu.
  • và tổng của dãy luôn nằm trong kiểu số nguyên bit có dấu.
  • ; nếu thì vẫn xét đoạn từ đến .

Scoring

  • Subtask ( số điểm): Trong mỗi bộ dữ liệu, và .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

4
0 1 16 25
6
1 1 4
0 3 4
1 1 4
0 4 2
1 1 4
1 4 4

Output

Case #1:
42
10
5
2

Giải thích: Ban đầu tổng là . Sau khi lấy căn trên các đoạn tương ứng, dãy lần lượt trở thành rồi , nên ba tổng còn lại là và .

Lời giải tóm tắt
  • Mô hình: Duy trì một dãy số nguyên không âm qua các phép lấy căn bậc hai nguyên trên đoạn và truy vấn tổng đoạn.
  • Thuật toán: Mỗi nút lưu tổng và cực đại. Khi cực đại không vượt 1, cả đoạn đã là điểm cố định của phép căn nên cập nhật dừng; nếu không, chỉ đi xuống những nhánh còn có thể đổ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: O((N+M) log N log log V) theo amortized; bộ nhớ O(N).