Hey leppy, i am facing problem understanding lazy propagation. It's been a week for me and i am still not able to understand this concept. I didn't clearly get your point in the above post. Suppose we call update on (3,7) for segment tree (1,10). How do we proceed and handle flags for (1,10) (1,5) (6,10)..?? I actually dont understand how do we handle flags of segments that either includes the update or query interval or intersect with it..Here are the functions that i have coded which of course dont work correctly..
[bbone=text,240]void update(long int node,long int b,long int e,long int i,long int j)
{
if(b>j || e
if(b>=i && e<=j)
{
if(flag[node])
{
flag[node]=0;
return;
}
else
{
tree[node]=e-b+1-tree[node];
flag[2*node]=!flag[2*node];
flag[2*node+1]=!flag[2*node+1];
return;
}
}
else
{
if(flag[node])
{
flag[node]=0;
tree[node]=e-b+1-tree[node];
flag[2*node]=!flag[2*node];
flag[2*node+1]=!flag[2*node+1];
}
update(2*node,b,(b+e)/2,i,j);
update(2*node+1,(b+e)/2+1,e,i,j);
tree[node]=tree[2*node]+tree[2*node+1];
return;
}
}
long int query(long int node,long int b,long int e,long int i,long int j)
{
long int l,r;
if(b>j || e<i) return -1;
if(b>=i && e<=j)
{
if(!flag[node]) return tree[node];
else
{
flag[node]=0;
tree[node]=e-b+1-tree[node];
flag[2*node]=!flag[2*node];
flag[2*node+1]=!flag[2*node+1];
return tree[node];
}
}
else
{
if(flag[node])
{
flag[node]=0;
tree[node]=e-b+1-tree[node];
flag[2*node]=!flag[2*node];
flag[2*node+1]=!flag[2*node+1];
}
l=query(2*node,b,(b+e)/2,i,j);
r=query(2*node+1,(b+e)/2+1,e,i,j);
if(l==-1) return tree[node]=r;
if(r==-1) return tree[node]=l;
return tree[node]=l+r;
//return tree[node]=query(2*node,b,(b+e)/2,i,j)+query(2*node+1,(b+e)/2+1,e,i,j);
}
}[/bbone]
I am trying to solve LITE/Flipping coins problem.
Please help me out with this..