Блог пользователя PR_0202

Автор PR_0202, история, 4 года назад, По-английски

I am confused about how to get sum from a node y to its ancestor x using a segment tree. there is query of 10^5 order consists of update and find sum of the nodes between them.!

  • Проголосовать: нравится
  • +7
  • Проголосовать: не нравится

»
4 года назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Auto comment: topic has been updated by PR_0202 (previous revision, new revision, compare).

»
4 года назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Please link the problem.

  • »
    »
    4 года назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    This problem is a subproblem of another problem

    • »
      »
      »
      4 года назад, # ^ |
        Проголосовать: нравится +15 Проголосовать: не нравится

      You can link that. It’s good to link problems so people know they’re not helping with a problem from an ongoing contest.

  • »
    »
    4 года назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

    what I did is doing some thing like prefix sum from the root node and for the sum I printed \n tree[y-1].second-tree[x-1].second

    and for update I did this \n

    void update(int y,int z){ tree[y].second+=z; for(int x: tree[y].first){ update(x,z); } } \n I am confused how to do this if O(long) time complexity please help me

»
4 года назад, # |
Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

Maintain an array which for every $$$i$$$ will store the sum of all the ancestors(including itself) in $$$array[i]$$$. Now to find the answer for $$$x$$$ and it's anscestor $$$y$$$ it would be equal to $$$array[x]$$$ — $$$array[parentOfY]$$$(similiar as we do in prefix sum from l to r).

Now coming to the update part. When a node value is updated, then what happens? Let $$$x$$$ is updated. Then only the nodes which are in the subtree of $$$x$$$(including itself) are affected, because $$$x$$$ can only be an ancestor of nodes in it's subtree or itself. So when when $$$x$$$ is update do a range update in it's subtree.

Suppose $$$x$$$ was holding value 10($$$a[x]$$$ not $$$array[x]$$$) earlier now it's an update and asks to change it to 5. since all the nodes in it's subtree were holding sum of all of it's ancestor which also includes $$$x$$$ so $$$5 - 10$$$ needs to be added to every nodes in subtree of $$$x$$$ incuding itself. For subtree update you can use preorder traversal.

Fenwick tree would be easier to use here.