1 条题解
-
0
#include <iostream> #include <vector> using namespace std; #define ll long long #define int long long #define pb push_back constexpr int maxn = 1e5 + 10; vector <int> e[maxn]; ll n, m, k, a[maxn], tot, st[maxn]; ll idx, dep[maxn], siz[maxn], fa[maxn], rdfn[maxn], top[maxn], wt[maxn], son[maxn]; void dfs1 (int u, int f) { dep[u] = dep[f] + 1, siz[u] = 1, fa[u] = f; ll maxs = -1; for (int v : e[u]) { if (v == f) continue; dfs1(v, u); siz[u] += siz[v]; if (maxs < siz[v]) son[u] = v, maxs = siz[v]; } } void dfs2 (int u, int topid) { rdfn[u] = ++ idx, top[u] = topid, wt[idx] = a[u]; if (!son[u]) return; dfs2(son[u], topid); for (int v : e[u]) { if (v == fa[u] || v == son[u]) continue; dfs2(v, v); } } struct segT { bool wl[2][maxn << 2], wr[2][maxn << 2]; void pushup (ll u) { wl[0][u] = wl[wl[0][u << 1]][u << 1 | 1]; wl[1][u] = wl[wl[1][u << 1]][u << 1 | 1]; wr[0][u] = wr[wr[0][u << 1 | 1]][u << 1]; wr[1][u] = wr[wr[1][u << 1 | 1]][u << 1]; } void build (int u, int l, int r, ll x) { if (l == r) { wl[0][u] = wr[0][u] = 1, wl[1][u] = wr[1][u] = !((wt[l] >> x) & 1); return; } int mid = l + r >> 1; build(u << 1, l, mid, x), build(u << 1 | 1, mid + 1, r, x); pushup(u); } void update (int u, int l, int r, int pos, int val) { if (l == r) { wl[0][u] = wr[0][u] = 1, wl[1][u] = wr[1][u] = !val; return; } int mid = l + r >> 1; if (pos <= mid) update(u << 1, l, mid, pos, val); else update(u << 1 | 1, mid + 1, r, pos, val); pushup(u); } bool ql (int u, int l, int r, int x, int y, bool c) { if (x <= l && r <= y) return wl[c][u]; int mid = l + r >> 1; if (y <= mid) return ql(u << 1, l, mid, x, y, c); else if (x > mid) return ql(u << 1 | 1, mid + 1, r, x, y, c); return ql(u << 1 | 1, mid + 1, r, x, y, ql(u << 1, l, mid, x, y, c)); } bool qr (int u, int l, int r, int x, int y, bool c) { if (x <= l && r <= y) return wr[c][u]; int mid = l + r >> 1; if (y <= mid) return qr(u << 1, l, mid, x, y, c); else if (x > mid) return qr(u << 1 | 1, mid + 1, r, x, y, c); return qr(u << 1, l, mid, x, y, qr(u << 1 | 1, mid + 1, r, x, y, c)); } } t[33]; int solve (int u, int v) { tot = 0; ll ans = 0; while (top[u] != top[v]) { if (dep[top[u]] >= dep[top[v]]) { for (int i = 0; i < k; i ++) ans = ans - (ans & (1ll << i)) + (1ll * t[i].qr(1, 1, n, rdfn[top[u]], rdfn[u], (ans >> i) & 1) << i); u = fa[top[u]]; } else { st[++ tot] = v; v = fa[top[v]]; } } if (dep[u] < dep[v]) for (int i = 0; i < k; i ++) ans = ans - (ans & (1ll << i)) + (1ll * t[i].ql(1, 1, n, rdfn[u], rdfn[v], (ans >> i) & 1) << i); else for (int i = 0; i < k; i ++) ans = ans - (ans & (1ll << i)) + (1ll * t[i].qr(1, 1, n, rdfn[v], rdfn[u], (ans >> i) & 1) << i); for (int i = tot; i >= 1; i --) { int x = st[i]; for (int b = 0; b < k; b ++) ans = ans - (ans & (1ll << b)) + (1ll * t[b].ql(1, 1, n, rdfn[top[x]], rdfn[x], (ans >> b) & 1) << b); } return ans; } signed main () { ios::sync_with_stdio(0), cin.tie(0); cin >> n >> m >> k; for (int i = 1; i <= n; i ++) cin >> a[i]; for (int i = 1; i < n; i ++) { int u, v; cin >> u >> v; e[u].pb(v), e[v].pb(u); } dfs1(1, 0), dfs2(1, 1); for (int i = 0; i < k; i ++) t[i].build(1, 1, n, i); while (m --) { string s; ll a, b; cin >> s >> a >> b; if (s == "Replace") { for (int i = 0; i < k; i ++) t[i].update(1, 1, n, rdfn[a], (b >> i) & 1); } else cout << solve(a, b) << '\n'; } return 0; }
信息
- ID
- 1362
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者