Giải thích: Ở test đầu, sau hai cập nhật mảng là 25330, nên tổng đoạn 2,…,5 bằng 11. Test thứ hai bắt đầu lại từ 0; hai cập nhật tạo mảng 1551, cho các tổng 12 và 5.
Lời giải tóm tắt
Phân tích: Với mảng hiệu d, cộng v trên [l,r] tạo hai sự kiện: d[l]+=v và d[r+1]-=v. Để lấy tổng đoạn chứ không chỉ giá trị tại một điểm, ta dùng hai Fenwick.
Phân tích: Gọi B1 lưu các hệ số của sự kiện và B2 lưu hệ số đã nhân với vị trí. Khi thêm một sự kiện (p,x), cập nhật:
Phân tích:B1[p] += x;
Phân tích:B2[p] += x·(p-1).
Phân tích: Khi đó tổng của mảng trên tiền tố 1..t là
Phân tích:P(t) = t·B1.prefix(t) - B2.prefix(t).
Thuật toán: Với mỗi test, tạo mới hai Fenwick rỗng.
Thuật toán: Cập nhật 0 l r v: thêm sự kiện (l,+v) và, nếu r<n, sự kiện (r+1,-v) vào cả hai Fenwick theo công thức trên.
Thuật toán: Truy vấn 1 l r: in P(r)-P(l-1).
Chứng minh: Xét một sự kiện (p,x). Nó làm mọi phần tử từ p trở đi tăng thêm x. Trong tiền tố 1..t với t≥p, sự kiện đóng góp cho đúng t-p+1 phần tử, tức x(t-p+1)=xt-x(p-1). Hai Fenwick tạo đúng giá trị này qua biểu thức t·B1.prefix(t)-B2.prefix(t); nếu t<p, sự kiện chưa nằm trong tiền tố nên đóng góp 0.
Chứng minh: Một cập nhật đoạn là tổng của sự kiện bắt đầu +v tại l và sự kiện kết thúc -v tại r+1, nên công thức tính đúng tổng tiền tố sau mọi cập nhật. Lấy hiệu hai tiền tố loại bỏ phần trước l và cho đúng tổng trên [l,r]. Mỗi test khởi tạo cấu trúc mới, vì vậy các test không ảnh hưởng lẫn nhau.
Độ phức tạp: Mỗi thao tác mất O(log n) thời gian. Mỗi test dùng O(n) bộ nhớ; tổng thời gian là O(Σ q log n) trên toàn input.