Hey guys, i was working on this problem 827D-Best edge weight

There is a skill i learnt from a code, if you used two-power walk (i don't know how to call it in a proper way), let *fa*[*i*][*j*] represents you start from *i*, walk 2^{j} steps upward, the vertex you can reach. *p*[*i*][*j*] represents the same stuff but instead of storing the vertex you can reach, we store the minimum weight among all the edges you pass from *u* to *v*.

if you want to change the weights on all the edges on the path from *u* to *v* on the tree, you only need to do the following part:

```
void modify(int u,int z,int w) //change to w, assume z is the lca to (u,v) coz u can split it into u->lca,v->lca
{
int c = dep[u]-dep[z];
for(int i = 19; i >= 0; -- i) if(c&(1<<i)) p[u][i] = min(p[u][i], w), u = fa[u][i];
}
```

and then in the main function, we do

```
fd(j,19,1) fo(i,1,n)
{
p[j-1][i] = min(p[j-1][i], p[j][i]);
p[j-1][fa[j-1][i]] = min(p[j-1][fa[j-1][i]], p[j][i]);
}
```

i am wondering if this skill is correct and i can use it for any offline modification?

thanks :P

In

`modify()`

in your code,`j`

is not defined in the loop. I don't understand anything going on in the code, can you explain in English or give link to submission instead?updated, thanks for figuring it out

I think it is called binary lifting.