Can anyone help me implement lazy propogation in this segment tree code??
i just can’t get it.
ok, try this
1: use binary index tree to update value
2: make use of this fact that a number will be reduced to 1 (by repetitive square root operation) in around 5-6 max operations
so for an x to y, don’t traverse from x to y, use some branching technique like
take an example… query is 2 to 9 and i know 4,5,6,7 are already reduced to 1…
i’ll execute this query as…
reduce 2 to its square root … what is next of 2… ok 3
reduce 3 to its square root … what is next of 3 which is not 1, ok 8
reduce 8 to its square root … what is next of 8 which is not 1, ok 9
reduce 9 to its square root … i am done with query.
so initial queries will take time but slowly they’ll get reduce.
hope so i explained properly?
if i didn’t please ask where i was not clear
Enjoy
the problem is that the update operations are over a given interval [a;b]. Let us consider that we have some number in the array K = 1<<64 = 18446744073709551616. This is quite big in fact and there might not be any numbers so big.
sqrt(1<<64) = 1<<32, sqrt(1<<32) = 1<<16, sqrt(1<<16) = 1<<8, …sqrt(1<<1) = 1<<0 = 1, sqrt(1<<1) = 1. Just after 7 operations we reached the bottom. So what can happen in the worst case if we do update operations over each element. We will just do 7 * n*log(n) updates and then we won’t to do any at all. => we can approach the updates naively, but if we have only 1s in a given segment, then we shouldn’t do any updates since this won’t change anything because sqrt(1) = 1.
For this, void update(int idx, int sfrom, int sto, int qfrom, int qto) {long long ss = (long long)sto - (long long)sfrom + 1LL; if (tree[idx].sum == ss) return;… rest update function}
i guess you are using inbuilt sqrt function for updating the array that is leading to TLE… try some faster sqrt calculations.
This too is giving TLE .
This too is giving TLE
getting TLE repeatedly guys…it would be great if anyone can tell me how would i get accepted.
Why can’t segment Tree be used here??
well, i am not getting how are you updating a range for an update query…
as in i used lazy propagation in queries like…
i have to set some value for each node… or something ,somewhere i have some pattern
i am not getting how you are updating a range… thats why i used BIT
well here we can’t use lazy propagation because sqrt(x1+x2)!=sqrt(x1)+sqrt(x2)
yeah… right! , this is what i was saying
So, here we can’t use segment tree(no lazy propagation)… did you get AC with BIT??