Sử dụng cây phân đoạn - phân vùng đệ quy của phạm vi thành các phạm vi nhỏ hơn. Mỗi khoảng [ a , b ] của các hoạt động cập nhật của bạn có thể được phân vùng thành O ( log n ) của các phạm vi trong phân vùng đệ quy này. Đối với mỗi phạm vi [ x , y ] lưu trữ:[1,n][a,b]O(logn)[x,y]
- Số của các khoảng [ a , b ] đã được tăng và không giảm sao cho [ x , y ] là một trong các phạm vi mà [ a , b ] được phân vùngc ( x , y)[ a , b ][ x , y][ a , b ]
- Số của các ô không được bao phủ bởi các tập hợp con được phân vùng của các khoảng nằm ở [ x , y ] hoặc thấp hơn trong đệ quybạn ( x , y)[ x , y]
Sau đó, nếu được phân chia đệ quy thành [ x , z ] và [ z + 1 , w ] ta có
u ( x , y ) = { 0 nếu c ( x , y ) > 0 u ( x , z ) + u ( z + 1 , y ) nếu không[ x , y][ x , z][ z+ 1 , w ]
bạn ( x , y) = { 0u ( x , z) + u ( z+ 1 , y)nếu c ( x , y) > 0nếu không thì
để chúng tôi có thể cập nhật từng giá trị
trong thời gian không đổi khi dữ liệu khác cho một phạm vi thay đổi. Mỗi truy vấn hỗ trợ có thể được trả lời bằng cách nhìn vào
u ( 1 , n ) .
bạn ( x , y)bạn ( 1 , n )
Để thực hiện thao tác tăng , phân vùng [ a , b ] thành các phạm vi O ( log n ) , tăng c ( x , y ) cho từng phạm vi này và sử dụng công thức trên để tính lại u ( x , y ) cho mỗi phạm vi này và từng tổ tiên của chúng. Các hoạt động giảm là như nhau với một giảm thay vì tăng.( a , b )[ a , b ]O ( nhật kýn )c ( x , y)bạn ( x , y)