범위의 재귀 파티션 인 더 작은 범위로 세그먼트 트리를 사용하십시오 . 업데이트 작업의 각 간격 [ a , b ] 은이 재귀 파티션에서 범위의 O ( log n ) 로 분할 될 수 있습니다 . 각 범위 [ x , y ] 저장에 대해 :[1,n][a,b]O(logn)[x,y]
- 숫자 의 간격 [ , B ] 증가되지 않은되도록 감소 [ X , Y를c(x,y)[a,b] 가 [ a , b ] 가 분할되는 범위 중 하나[x,y][a,b]
- 숫자 u(x,y)재귀 에서 이하의 분할 된 부분 집합으로 덮여 있지 않은 셀[x,y]
경우 로 재귀 분할 [ X , Z ] 및 [ Z + 1은 , 승 ] 우리가
U ( X , Y ) = { 0 의 경우 C ( X , Y ) > 0 U ( X , Z ) 그렇지 않으면 + u ( z + 1 , y )[x,y][x,z][z+1,w]
u(x,y)={0u(x,z)+u(z+1,y)if c(x,y)>0otherwise
따라서 범위의 다른 데이터가 변경 될 때 일정한 시간에 각
값을 업데이트 할 수 있습니다 . 각 지원 쿼리는
u ( 1 , n ) 를보고 응답 할 수 있습니다 .
u(x,y)u(1,n)
증가 연산 을 수행하려면 [ a , b ] 를 O ( log n ) 범위 로 분할 하고 이러한 각 범위에 대해 c ( x , y ) 를 증가 시키고 위 공식을 사용하여 u 를 다시 계산하십시오.(a,b)[a,b]O(logn)c(x,y)u(x,y)