#include using i32 = int32_t; using u32 = uint32_t; using u64 = uint64_t; using usz = size_t; template using ptt = std::pair; template using vec = std::vector; template using vvec = vec>; namespace tifa_libs::ds { template class dsu_basic { vec p; public: explicit dsu_basic(usz sz): p(sz, -1) {} i32 find(u32 x) { return p[x] < 0 ? (i32)x : p[x] = find((u32)p[x]); } u32 size(u32 x) { return (u32)-p[(u32)find(x)]; } bool same(u32 x, u32 y) { return find(x) == find(y); } bool merge(u32 x, u32 y) { if ((x = (u32)find(x)) == (y = (u32)find(y))) return false; if (RANK_ && p[x] > p[y]) std::swap(x, y); p[x] += p[y]; p[y] = (i32)x; return true; } }; } // namespace tifa_libs::ds namespace tifa_libs::graph { namespace adjlist_impl_ { template > struct E; template struct E { u32 to; T w; E() {} E(u32 v, T const &w): to(v), w(w) {} }; template struct E { u32 to; E() {} explicit E(u32 v): to(v) {} }; template class adjlist { protected: u32 m; vvec> g; public: //! vertex ID: [0, n) explicit adjlist(u32 n = 0): m(0), g(n) {} void reset_v_size(u32 n) { g.resize(n); } void clear() { g.clear(); } void shrink() { g.shrink_to_fit(); } template E &add_arc(u32 u, Ts &&...args) { ++m; g[u].emplace_back(args...); return g[u].back(); } template ptt &> add_edge(u32 u, u32 v, Ts &&...args) { return {add_arc(u, v, args...), add_arc(v, u, args...)}; } auto &operator[](u32 u) { return g[u]; } auto operator[](u32 u) const { return g[u]; } u32 v_size() const { return (u32)g.size(); } u32 arc_size() const { return m; } }; } // namespace adjlist_impl_ using adjlist_impl_::adjlist; } // namespace tifa_libs::graph namespace tifa_libs::graph { enum state_tdfs { s_dfn = 1, s_sz = 2, s_fa = 4, s_dep = 8, s_maxson = 16, s_go = 32, s_sum_node_w = 64 }; template struct tree: public adjlist { u32 rt; vec node_w, dfn, sz, fa, dep, maxson, top; vec sum_node_w; vec> go; explicit tree(u32 n, vec NODE_W = vec(), u32 root = 0) : adjlist(n), rt(root), node_w(NODE_W) {} void clear(u32 u = 0, u32 fa = 0) { for (auto v : this->g[u]) if (v.to != fa) clear(v.to, u); this->g[u].clear(); } template inline void reset_dfs_info() { u32 n = (u32)this->v_size(); if constexpr (state & s_dfn) dfn = vec(n); if constexpr (state & (s_sz | s_maxson)) sz = vec(n); if constexpr (state & s_fa) fa = vec(n); if constexpr (state & s_dep) dep = vec(n); if constexpr (state & s_maxson) maxson = vec(n, n); if constexpr (state & s_go) go = vec>(n, vec(21u, n)); if constexpr (state & s_sum_node_w) sum_node_w = vec(n); u32 cnt = 0; auto before = [&](u32 u, u32 f) { if constexpr (state & s_dfn) dfn[u] = cnt++; if constexpr (state & (s_sz | s_maxson)) sz[u] = 1; if constexpr (state & s_fa) fa[u] = f; if constexpr (state & s_go) { go[u][0] = f; for (u32 i = 1; i <= 20u && go[u][i - 1] < n; i++) go[u][i] = go[go[u][i - 1]][i - 1]; } if constexpr (state & s_sum_node_w) sum_node_w[u] = node_w[u]; }; auto pre_dfs = [&](auto const &ev, u32 u) { if constexpr (state & s_dep) dep[ev.to] = dep[u] + 1; }; auto post_dfs = [&](auto const &ev, u32 u) { if constexpr (state & (s_sz | s_maxson)) sz[u] += sz[ev.to]; if constexpr (state & s_maxson) if (maxson[u] == n || sz[ev.to] > sz[maxson[u]]) maxson[u] = ev.to; if constexpr (state & s_sum_node_w) sum_node_w[u] += sum_node_w[ev.to]; }; dfs_(rt, n, before, pre_dfs, post_dfs); } template void reset_top() { u32 n = (u32)this->v_size(); if (maxson.empty()) reset_dfs_info(); if constexpr (need_dfn) dfn = vec(n); top = vec(n, n); u32 cnt = 0; auto before = [&](u32 u, u32 top_) { if constexpr (need_dfn) dfn[u] = cnt++; top[u] = top_; }; dfs_top_(rt, rt, before); } private: template void dfs_(u32 u, u32 fa, Fb before, Fp pre_dfs, Fs post_dfs) { before(u, fa); for (auto v : this->g[u]) if (v.to != fa) { pre_dfs(v, u); dfs_(v.to, u, before, pre_dfs, post_dfs); post_dfs(v, u); } } template void dfs_top_(u32 u, u32 top_, F before) { before(u, top_); if (maxson[u] == this->v_size()) return; dfs_top_(maxson[u], top_, before); for (auto v : this->g[u]) if (top[v.to] == this->v_size()) dfs_top_(v.to, v.to, before); } }; } // namespace tifa_libs::graph namespace tifa_libs::graph { //!! edge: w u v template inline std::pair, vec> kruskal_re_tree( vec> a, u32 n, vec node_w = vec()) { std::sort(a.begin(), a.end()); if (node_w.size()) node_w.resize(2 * n - 1); tree tr(2 * n - 1, node_w); vec w_(2 * n - 1); ds::dsu_basic dsu(2 * n - 1); u32 m = n - 1, cnt = n; for (auto [w, u, v] : a) { u = dsu.find(u), v = dsu.find(v); if (u != v) { u32 t = cnt++; w_[t] = w; tr.add_arc(t, u), tr.add_arc(t, v); dsu.merge(t, u), dsu.merge(t, v); --m; } if (m == 0) break; } tr.rt = cnt - 1; return {tr, w_}; } } // namespace tifa_libs::graph int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); u32 n, m, q; std::cin >> n >> m >> q; vec nw(n); for (auto &x : nw) std::cin >> x; vec> e(m); for (auto &[w, u, v] : e) std::cin >> u >> v >> w, --u, --v; auto [tr, ew] = tifa_libs::graph::kruskal_re_tree(e, n, nw); n = tr.v_size(); tr.reset_dfs_info(); while (q--) { u32 x, k; std::cin >> x >> k; --x; u64 ans = k + tr.sum_node_w[x]; while (x != tr.rt) { u32 tem = x; for (i32 i = 20; i >= 0; i--) { if (tr.go[x][i] < n && ew[tr.go[x][i]] <= ans) x = tr.go[x][i]; } if (x == tem) break; ans = k + tr.sum_node_w[x]; } std::cout << ans << '\n'; } return 0; }