bastard123's blog

By bastard123, history, 4 years ago, In English
  1. Consider N boxes numbered 1 to N. Each box can house any number of chocolates. And initially all the boxes are empty.

  2. There are two types of queries that can be posed by the throwers.

    a. 0 l r -> Add chocolates to the boxes between the index l and r (inclusive) such that l'th box get 1 chocolate, (l+1)the box gets 2 chocolates ... r'th box gets (r-l+1) chocolate(s)

    b. 1 l r -> Count the number of chocolates that are currently in the boxes between l and r (inclusive)

Can anyone provide some hints?

  • Vote: I like it
  • +5
  • Vote: I do not like it

»
4 years ago, # |
  Vote: I like it 0 Vote: I do not like it

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

»
4 years ago, # |
  Vote: I like it 0 Vote: I do not like it

You can try out the problem here: https://cses.fi/problemset/task/1736

»
4 years ago, # |
  Vote: I like it +3 Vote: I do not like it

You could do this using segment tree with lazy propagation.

Just store the starting element of the sequence for current range [l,r] in lazy[v].

So while pushing this lazy value in the segment tree, it could be done :

segt[v] += (2*lazy[v] + r — l)*(r-l+1)/2; // sum of lazy[v], lazy[v]+1, lazy[v]+2.... upto r-l+1 elements

P.S: Just remember that while pushing lazy[v] to its children, you would need to pass the starting elements of their respective ranges as lazy values