代码也很短!
#include <bits/stdc++.h>
#define mk make_pair
#define pb emplace_back
#define fi first
#define se second
#define pii pair<int, int>
#define fore(i, u) for (int i = h[u]; i; i = e[i].nxt)
using namespace std;
inline int read() {
int x = 0, f = 1;
char ch = getchar();
while (! isdigit(ch)) { if (ch == '-') f = -1; ch = getchar(); }
while (isdigit(ch)) { x = x * 10 + ch - 48; ch = getchar(); }
return x * f;
}
const int maxn = 2e5 + 10, L = 31;
typedef bitset<L> bit;
int n, m, Q, en; map<int, int> mp;
struct Edge { int u, v; bit w; } e[maxn << 1];
namespace base {
bit p[L]; int st[L], tp;
void undo(int x) { while (x < tp) p[st[tp]].reset(), tp --; }
void ins(bit x) {
for (int i = L - 1; ~i; i --) if (x[i]) {
if (p[i].any()) x ^= p[i]; else { p[st[++ tp] = i] = x; break; } }
}
bit qry() { bit x(0);
for (int i = L - 1; ~i; i --) if (p[i].any()) x ^= p[i];
return x;
}
}
pii st[maxn]; int tp;
namespace union_ {
struct Node { int fa; bit d; int rk; } f[maxn];
void init() { for (int i = 1; i <= n; i ++) f[i] = Node {i, 0, 0}; }
int fnd(int u) { return u == f[u].fa ? u : fnd(f[u].fa); }
bit get(int u) { return u == f[u].fa ? 0 : (get(f[u].fa) ^ f[u].d); }
void merg(int u, int v, bit w) {
int fu = fnd(u), fv = fnd(v);
if (fu == fv) base :: ins(get(u) ^ get(v) ^ w);
else {
if (f[fu].rk < f[fv].rk) swap(u, v), swap(fu, fv);
if (f[fu].rk == f[fv].rk) f[fu].rk ++, st[++ tp] = {fv, fu};
else st[++ tp] = {fv, 0};
f[fv] = Node {fu, get(u) ^ get(v) ^ w, f[fv].rk};
}
}
}
using namespace union_;
void pr(bit x) {
string s = x.to_string();
int p = 0; while (p < s.size() - 1 && s[p] == '0') p ++;
for (; p < s.size(); p ++) cout << s[p]; cout << "\n";
}
namespace seg {
vector<int> c[maxn << 2];
void ins(int p, int l, int r, int x, int y, int id) {
if (x > y) return ;
if (x <= l && r <= y) return c[p].pb(id), void();
int mi = l + r >> 1;
if (x <= mi) ins(p << 1, l, mi, x, y, id);
if (mi < y) ins(p << 1 | 1, mi + 1, r, x, y, id);
}
void dfs(int p, int l, int r) {
int ls = tp, lb = base :: tp;
for (auto id : c[p]) merg(e[id].u, e[id].v, e[id].w);
if (l == r) pr(base :: qry().to_ulong());
else { int mi = l + r >> 1; dfs(p << 1, l, mi), dfs(p << 1 | 1, mi + 1, r); }
base :: undo(lb);
while (ls < tp) { auto [u, v] = st[tp]; tp --;
if (v) f[v].rk --; f[u] = Node {u, 0, f[u].rk};
}
}
}
int main() {
n = read(), en = m = read(), Q = read(), init();
for (int i = 1; i <= m; i ++) {
int u = read(), v = read(); bit w; cin >> w, e[i] = Edge {u, v, w}, mp[i] = 1; }
int ex = m + Q;
for (int i = 2; i <= Q + 1; i ++) { string op; cin >> op; int x = read() + m;
if (op[1] == 'd') { int y = read(); bit w; cin >> w; e[++ en] = Edge {x - m, y, w}, mp[en] = i; }
else if (op[1] == 'a') { seg :: ins(1, 1, Q + 1, mp[x], i - 1, x), mp[x] = Q + 2; }
else { bit z; cin >> z; e[++ ex] = e[x], e[x].w = z; seg :: ins(1, 1, Q + 1, mp[x], i - 1, ex), mp[x] = i; }
}
for (auto [x, y] : mp) seg :: ins(1, 1, Q + 1, y, Q + 1, x); seg :: dfs(1, 1, Q + 1);
return 0;
}