Дерево двоичного индекса (обновление диапазона и точечный запрос)

Может ли кто-нибудь помочь мне понять в дереве двоичного индекса, когда мы делаем обновление диапазона - Почему нет, мы обновляем каждый элемент, почему только начальный элемент и конечный элемент

Например 0

мы должны обновить диапазон элементов массива в BIT для arr[x] до arr[y] . В соответствии с функцией обновления точки дерева двоичных индексов. Она обновит совокупную частоту индекса x и всех тех индексов> чем x, которые будут получены при обновлении,


Но если мы используем функцию обновления точки для обновления диапазона. Поэтому мы не обновляем каждый индекс больше, чем x и меньше, чем y, используя функцию обновления точки. Поскольку значение "обновление диапазона" означает, что каждый элемент должен обновляться со значением и как обновление начального индекса и одного указанного выше конечного индекса охватывает все обновления

почему мы не делаем

..................................................

 for (i =[x] to [y])
    pointupdate(ar[i],val);// why we are not doing this 

update(p, v): //point update
  for (; p <= N; p += p&(-p))
    ft[p] += v   

# Add v to A[a...b] 
update(a, b, v):     // why we are using this only for update of one element how other elements greater than a will be coverd
  update(a, v)     
  update(b + 1, -v)     

я

1 ответ

Когда вы обновляете BIT[a]+=v, это означает, что запрос по каждому индексу x>=a увидим v приращение.

Чтобы выполнить обновление диапазона таким образом, вы увеличиваете v на диапазоне начинается и уменьшается v после окончания диапазона. Это значит только между a а также b приращение будет видно.

Другие вопросы по тегам