結果
問題 |
No.2676 A Tourist
|
ユーザー |
|
提出日時 | 2025-03-20 16:44:17 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 447 ms / 5,000 ms |
コード長 | 4,113 bytes |
コンパイル時間 | 2,751 ms |
コンパイル使用メモリ | 207,264 KB |
実行使用メモリ | 49,160 KB |
最終ジャッジ日時 | 2025-03-20 16:44:37 |
合計ジャッジ時間 | 16,756 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 31 |
ソースコード
#include <bits/stdc++.h> using namespace std; template<typename Ostream, typename Cont> typename enable_if<is_same<Ostream, ostream>::value, Ostream&>::type operator<<(Ostream& os, const Cont& v){ os << "[ "; for(auto &x : v) os << x << ' '; return os << "]"; } template<typename Ostream, typename ...Ts> Ostream& operator << (Ostream &os, const pair<Ts...> &p){ return os << "{" << p.first << ", " << p.second << "}"; } void dbg_cerr() { cerr << "\e[0m\n"; } template<typename Head, typename... Tail> void dbg_cerr(Head H, Tail... T) { cerr << ' ' << H; dbg_cerr(T...); } #ifdef LTF #define DEBUG(...) cerr << "\e[1;31m[" #__VA_ARGS__ "]:", dbg_cerr(__VA_ARGS__) #else #define DEBUG(...) #endif template<class T> struct Fenwick { int n; vector<T> v; Fenwick(int n_): n(n_) { v.resize(n + 1, 0); } void add(int x, T d) { for (int i = x; i <= n; i += i & -i) v[i] += d; } T query(int x) { T res = 0; for (int i = x; i; i -= i & -i) res += v[i]; return res; } }; void Solve() { int N, Q; cin >> N >> Q; vector<int64_t> a(N + 1); for (int i = 1; i <= N; i++) cin >> a[i]; vector g(N + 1, vector<int>()); for (int i = 0; i < N - 1; i++) { int x, y; cin >> x >> y; g[x].push_back(y), g[y].push_back(x); } vector<int64_t> chsum(N + 1); constexpr int kC = 19; vector anc(kC, vector<int>(N + 1, 0)); vector<int> in(N + 1), out(N + 1); int dfs_clock = 0; auto Dfs = [&](auto self, int u, int fa) -> void { anc[0][u] = fa; in[u] = ++dfs_clock; for (int v : g[u]) { if (v == fa) continue; self(self, v, u); chsum[u] += a[v]; } out[u] = dfs_clock; }; auto is_ancestor = [&](int u, int v) { return in[u] <= in[v] && out[u] >= out[v]; }; Dfs(Dfs, 1, 0); out[0] = dfs_clock; for (int j = 1; j < kC; j++) { for (int i = 1; i <= N; i++) { anc[j][i] = anc[j - 1][anc[j - 1][i]]; } } auto lca = [&](int u, int v) { if (is_ancestor(u, v)) return u; if (is_ancestor(v, u)) return v; for (int i = kC - 1; i >= 0; i--) { if (!is_ancestor(anc[i][u], v)) { u = anc[i][u]; } } return anc[0][u]; }; Fenwick<int64_t> tree(N); for (int i = 1; i <= N; i++) { // [in[u], out[u]] will get chsum[u] tree.add(in[i], chsum[i]); tree.add(out[i] + 1, -chsum[i]); } while (Q--) { int op, u, v; cin >> op >> u >> v; if (op == 0) { // a[u] += v a[u] += v; int p = anc[0][u]; if (p) { chsum[p] += v; tree.add(in[p], v); tree.add(out[p] + 1, -v); } } else { // sum of chsum on path u--v + a[lca(u, v)] + a[p[lca(u, v)]] int l = lca(u, v); int p = anc[0][l];; int64_t ans = tree.query(in[u]) + tree.query(in[v]) - 2 * tree.query(in[l]) + chsum[l]; ans += a[l]; if (p) ans += a[p]; cout << ans << '\n'; } } } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int T = 1; // cin >> T; while (T--) { Solve(); } return 0; }