ข้อนี้มีวิธีทำได้หลายวิธี แต่วิธีที่จะนำเสนอเป็นวิธีที่ผู้เขียนคิดว่าตรงไปตรงมาที่สุด
เริ่มต้นเราจะกำหนดการอ้างอิงตำแหน่งบนตารางเป็นแบบ 1-indexed (เริ่มต้นที่ 1) และจะนิยามแนวแทยงแนวหนึ่งเป็นทุก ๆ ช่องที่มีผลรวมของตำแหน่งแถวและหลักเป็นค่าเดียวกัน (นั่นคือ แนวแทยงคือช่องที่มี เท่ากัน โดย )
จากนั้นเราจะนิยาม เป็นผลรวมของสี่เหลี่ยมดังรูปด้านล่าง นั่นคือ จะมีค่าเท่ากับ ผลรวมของทุก ๆ ช่อง ที่ และ โดยที่ถ้า ให้หาบวกแค่ครึ่งเดียว
สังเกตว่า คำตอบของคำถามใด ๆ จะสามารถคำนวณได้โดยใช้แค่ และผลรวมของตัวเลขในสี่เหลี่ยมมุมฉากด้านล่างของมัน ดังรูปด้านล่าง
นั่นคือ พื้นที่สีฟ้า จะมีค่าเท่ากับ ลบด้วยพื้นที่สีเขียว
ดังนั้นเราจำเป็นจะต้องทำสองสิ่ง
- query และ point update ค่า ให้ได้เร็ว ๆ
- query และ point update ผลบวกของสี่เหลี่ยมมุมฉากใด ๆ ให้ได้เร็ว ๆ
สิ่งที่ 2 นั้นค่อนข้างตรงไปตรงมา สามารถทำได้ด้วย 2D Query Structure โดยในที่นี้จะแนะนำ 2D Fenwick Tree เนื่องจากเป็นโครงสร้างข้อมูลที่เขียนค่อนข้างง่าย
เรามาวิเคราะห์สิ่งแรกกัน สมมติว่าช่องที่ ถูกเปลี่ยนแปลงค่า ค่า ที่จะต้องเปลี่ยนไปด้้วยก็คือ
- และ จะโดนเปลี่ยนแปลงไปครึ่งหนึ่ง
- และ จะโดนเปลี่ยนแปลงเต็ม ๆ ค่า
ทั้งสองเป็นการเปลี่ยนแปลงค่าทั้งหมดในสี่เหลี่ยมมุมฉากรูปหนึ่ง ดังนั้นเราจำเป็นที่จะต้องหาโครงสร้างข้อมูลที่ถาม ได้ และอัพเดทเป็นสี่เหลี่ยมมุมฉากได้เร็ว ๆ (นั่นคือ 2D point query และ ranged update นั่นเอง)
สิ่งที่กล่าวสามารถทำได้โดย 2D Fenwick Tree เช่นกัน
การจะเพิ่มค่าของทุกช่องในสี่เหลี่ยมที่มีจุดยอดที่ และ ด้วย ให้ทำการ
- เพิ่มค่าที่ ด้วย
- ลดค่าที่ ด้วย
- ลดค่าที่ ด้วย
- เพิ่มค่าที่ ด้วย
ส่วนการหาค่าที่ช่อง ให้ทำการหาผลรวมของสี่เหลี่ยมที่มีจุดยอดเป็น และ
ดังนั้นเมื่อเราเอาทุกอย่างมารวมกัน เราจะได้อัลกอริธึมที่แก้ปัญหานี้ในเวลา และความจำ