voidadd_edge(int u, int v, int w){ table[u].push_back({v, w}); } } G;
int dep[N]; int anc[18][N]; int val[18][N];
voiddfs_init(int u, int fu){ dep[u] = dep[fu] + 1;
anc[0][u] = fu; for (int i = 1; i <= 17; i ++) { anc[i][u] = anc[i - 1][anc[i - 1][u]]; val[i][u] = std::max(val[i - 1][u], val[i - 1][anc[i - 1][u]]); }
for (auto [v, w] : G.table[u]) { if (v == fu) { continue; } val[0][v] = w; dfs_init(v, u); } }
intcalc(int x, int y){ int ans = 0; if (dep[x] > dep[y]) std::swap(x, y); for (int i = 17; i >= 0; i --) { if (dep[x] <= dep[y] - (1 << i)) { chmax(ans, val[i][y]); y = anc[i][y]; } } if (x == y) return ans; for (int i = 17; i >= 0; i --) { if (anc[i][x] ^ anc[i][y]) { chmax(ans, val[i][x]), chmax(ans, val[i][y]); x = anc[i][x], y = anc[i][y]; } } chmax(ans, val[0][x]), chmax(ans, val[0][y]); return ans; }
int a[N];
namespace ST { int logn; std::vector< std::vector<int> > f;
voidinit(){ logn = std::__lg(n); f.assign(logn + 1, std::vector<int>(n + 1, 0)); for (int i = 1; i <= n; i ++) { f[0][i] = a[i]; } for (int j = 1; j <= logn; j ++) { for (int i = 1; i <= n - (1 << j) + 1; i ++) { f[j][i] = std::max(f[j - 1][i], f[j - 1][i + (1 << (j - 1))]); } } }
intask(int l, int r){ int k = std::__lg(r - l + 1); return std::max(f[k][l], f[k][r - (1 << k) + 1]); } }