inline bool cmp(int x, int y) {return dfn[x] < dfn[y];}
inline void build()
{
int K = gi <int> ();
tmp.clear();
for (int i = 1; i <= K; i+=1) tmp.pb(gi <int> ());
sort(tmp.begin(), tmp.end(), cmp);
int sz = (int)tmp.size();
for (int i = 0; i < sz - 1; i+=1) tmp.pb(LCA :: getLCA(tmp[i], tmp[i + 1]));
sort(tmp.begin(), tmp.end(), cmp);
tmp.erase(unique(tmp.begin(), tmp.end()), tmp.end());
tp = 0;
for (auto x : tmp)
{
while (tp && low[stk[tp]] < dfn[x]) --tp;
if (tp) g[stk[tp]].pb(x), g[x].pb(stk[tp]), vis[x] = vis[stk[tp]] = true;
stk[++tp] = x;
}
}