canuc80k1600·1/50

Cộng Điểm, Hỏi Tiền Tố

Nộp bài trên LQDOJ

Bài 16 · Fenwick Tree

Có một mảng gồm phần tử, được đánh chỉ số từ đến . Ban đầu, mọi phần tử đều bằng .

Bạn cần xử lý lần lượt thao tác thuộc một trong hai dạng:

  • : cộng delta vào ;
  • ? i: tính tổng của phần tử đầu tiên, tức .

Với , tổng cần tính là tổng của đoạn rỗng và bằng .

Input

  • Dòng đầu chứa hai số nguyên và .
  • 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 ? i, in tổng tương ứng trên một dòng.

Constraints

  • .
  • .
  • Trong thao tác : và - .
  • Trong thao tác ? i: .
  • Mọi tổng đều nằm trong miền của số nguyên có dấu -bit.

Scoring

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

Example

Test 1

Input

5 8
? 0
+ 1 4
+ 3 -2
? 2
+ 0 7
? 1
? 4
? 5

Output

0
4
7
9
9

Giải thích: Lệnh ? 2 lấy hai vị trí nên cho kết quả . Sau khi cộng vào vị trí , tổng trên và đều bằng .

Lời giải tóm tắt
  • Phân tích: Mỗi phép hỏi cần tổng của một tiền tố, còn mỗi phép cập nhật chỉ thay đổi một vị trí. Duyệt lại cả tiền tố cho từng truy vấn có thể tốn O(nq), không phù hợp khi n và q rất lớn.
  • Phân tích: Fenwick Tree hỗ trợ đúng hai thao tác cần thiết: cộng vào một vị trí và lấy tổng tiền tố, đều trong O(log n).
  • Thuật toán: Fenwick dùng chỉ số từ 1, trong khi đề dùng chỉ số từ 0.
  • Thuật toán: Với + i delta, cập nhật Fenwick tại vị trí i+1 thêm delta.
  • Thuật toán: Với ? i, lấy tổng Fenwick từ vị trí 1 đến i. Đây chính là tổng của các phần tử a[0] đến a[i-1].
  • Thuật toán: Trường hợp i=0, vòng lặp tính tổng tiền tố không thực hiện bước nào nên trả về 0.
  • Chứng minh: Sau mỗi thao tác cập nhật, Fenwick lưu đúng tổng đóng góp của mọi phần tử đã được cộng vào mảng: lần cộng tại a[i] được đưa vào đúng vị trí i+1 của cấu trúc.
  • Chứng minh: Với truy vấn ? i, tổng Fenwick tại chỉ số i bằng tổng các vị trí Fenwick 1..i, tương ứng chính xác với các vị trí mảng 0..i-1. Vì vậy mỗi giá trị được in ra đúng theo yêu cầu.
  • Độ phức tạp: Mỗi thao tác mất O(log n) thời gian. Tổng thời gian là O(q log n) và bộ nhớ là O(n).