#include <bits/stdc++.h>
using namespace std;
using ull = unsigned long long;
const ull INF64 = std::numeric_limits<ull>::max();
struct Change {
int kind;
int v;
int delta;
};
struct DSU {
int n;
vector<int> parent, sz;
vector<ull> xorPar;
vector<vector<ull>> basis;
vector<Change> hist;
DSU(int N): n(N),
parent(N+1), sz(N+1,1),
xorPar(N+1,0), basis(N+1)
{ iota(parent.begin(), parent.end(), 0); }
pair<int, ull> find(int v) {
ull x = 0;
int u = v;
while (parent[u] != u) {
x ^= xorPar[u];
u = parent[u];
}
return {u, x};
}
void add_basis(int root, ull x) {
ull y = x;
for (ull b : basis[root]) y = min(y, y ^ b);
if (y == 0) return;
basis[root].push_back(y);
hist.push_back({2, root, 0});
}
void unite(int a, int b, ull w) {
auto fa = find(a), fb = find(b);
int ra = fa.first, rb = fb.first;
ull xa = fa.second, xb = fb.second;
ull cyc = xa ^ xb ^ w;
if (ra == rb) { add_basis(ra, cyc); return; }
if (sz[ra] < sz[rb]) swap(ra, rb);
hist.push_back({0, rb, 0});
parent[rb] = ra;
xorPar[rb] = cyc;
hist.push_back({1, ra, sz[rb]});
sz[ra] += sz[rb];
for (ull v : basis[rb]) add_basis(ra, v);
}
void rollback(size_t checkpoint) {
while (hist.size() > checkpoint) {
Change c = hist.back(); hist.pop_back();
if (c.kind == 2) basis[c.v].pop_back();
else if (c.kind == 1) sz[c.v] -= c.delta;
else {
int v = c.v;
parent[v] = v;
xorPar[v] = 0;
}
}
}
};
struct Edge {
int u, v;
ull w;
int red;
int l, r;
};
struct SegTree {
int Q;
vector<vector<Edge>> bucket;
SegTree(int _Q): Q(_Q), bucket(4*_Q+4) {}
void add(int node,int L,int R,int ql,int qr,const Edge& e){
if (qr < L || R < ql) return;
if (ql <= L && R <= qr){ bucket[node].push_back(e); return; }
int mid=(L+R)>>1;
add(node<<1, L, mid, ql, qr, e);
add(node<<1|1, mid+1, R, ql, qr, e);
}
};
ull reduce_with_basis(const vector<ull>& B, ull x){
ull ans = x;
for (ull b: B) ans = min(ans, ans ^ b);
return ans;
}
struct Op {
int type;
int u, v, p;
};
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N, M0, Q;
if(!(cin >> N >> M0 >> Q)) return 0;
const int OFF = N;
auto id = [&](int v,int par){ return v + par*OFF; };
vector<Edge> intervals; intervals.reserve(M0 + Q);
for (int i=0;i<M0;++i){
int u,v,c; ull w; cin >> u >> v >> w >> c;
intervals.push_back({u,v,w,(c==0), 1, Q});
}
struct InsertData{ int u,v,red,time; ull w; };
unordered_map<int,InsertData> active; active.reserve(Q*2);
int nextId = 1;
vector<Op> ops(Q+1);
for(int t=1;t<=Q;++t){
int tp; cin >> tp;
if(tp==1){
int u,v,p; cin >> u >> v >> p;
ops[t] = {1,u,v,p};
}else if(tp==2){
int u,v,c; ull w; cin >> u >> v >> w >> c;
active[nextId] = {u,v,(c==0),t,w};
ops[t] = {2,0,0,0};
++nextId;
}else{
int idd; cin >> idd;
auto it = active.find(idd);
auto d = it->second; active.erase(it);
intervals.push_back({d.u,d.v,d.w,d.red, d.time, t-1});
ops[t] = {3,0,0,0};
}
}
for(auto &kv: active){
auto &d = kv.second;
intervals.push_back({d.u,d.v,d.w,d.red, d.time, Q});
}
SegTree seg(Q);
for(const Edge& e: intervals)
if(e.l<=e.r) seg.add(1,1,Q,e.l,e.r,e);
DSU dsu(2*N);
vector<ull> answers; answers.reserve(Q);
function<void(int,int,int)> dfs = [&](int node,int L,int R){
size_t cp = dsu.hist.size();
for(const Edge& e : seg.bucket[node]){
int r = e.red;
dsu.unite(id(e.u,0), id(e.v,r), e.w);
dsu.unite(id(e.u,1), id(e.v,r^1), e.w);
}
if(L==R){
const Op& op = ops[L];
if(op.type==1){
int u0 = id(op.u,0);
int vp = id(op.v,op.p);
auto fu = dsu.find(u0);
auto fv = dsu.find(vp);
ull raw = fu.second ^ fv.second;
ull ans = reduce_with_basis(dsu.basis[fu.first], raw);
answers.push_back(ans);
}
}else{
int mid=(L+R)>>1;
dfs(node<<1, L, mid);
dfs(node<<1|1, mid+1, R);
}
dsu.rollback(cp);
};
dfs(1,1,Q);
for(ull x: answers) cout << x << '\n';
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp1c2luZyB1bGwgPSB1bnNpZ25lZCBsb25nIGxvbmc7CmNvbnN0IHVsbCBJTkY2NCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dWxsPjo6bWF4KCk7CgpzdHJ1Y3QgQ2hhbmdlIHsKICAgIGludCBraW5kOwogICAgaW50IHY7CiAgICBpbnQgZGVsdGE7Cn07CnN0cnVjdCBEU1UgewogICAgaW50IG47CiAgICB2ZWN0b3I8aW50PiBwYXJlbnQsIHN6OwogICAgdmVjdG9yPHVsbD4geG9yUGFyOwogICAgdmVjdG9yPHZlY3Rvcjx1bGw+PiBiYXNpczsKICAgIHZlY3RvcjxDaGFuZ2U+IGhpc3Q7CgogICAgRFNVKGludCBOKTogbihOKSwKICAgICAgICAgICAgICAgIHBhcmVudChOKzEpLCBzeihOKzEsMSksCiAgICAgICAgICAgICAgICB4b3JQYXIoTisxLDApLCBiYXNpcyhOKzEpCiAgICB7IGlvdGEocGFyZW50LmJlZ2luKCksIHBhcmVudC5lbmQoKSwgMCk7IH0KCiAgICBwYWlyPGludCwgdWxsPiBmaW5kKGludCB2KSB7CiAgICAgICAgdWxsIHggPSAwOwogICAgICAgIGludCB1ID0gdjsKICAgICAgICB3aGlsZSAocGFyZW50W3VdICE9IHUpIHsKICAgICAgICAgICAgeCBePSB4b3JQYXJbdV07CiAgICAgICAgICAgIHUgID0gcGFyZW50W3VdOwogICAgICAgIH0KICAgICAgICByZXR1cm4ge3UsIHh9OwogICAgfQoKICAgIHZvaWQgYWRkX2Jhc2lzKGludCByb290LCB1bGwgeCkgewogICAgICAgIHVsbCB5ID0geDsKICAgICAgICBmb3IgKHVsbCBiIDogYmFzaXNbcm9vdF0pIHkgPSBtaW4oeSwgeSBeIGIpOwogICAgICAgIGlmICh5ID09IDApIHJldHVybjsKICAgICAgICBiYXNpc1tyb290XS5wdXNoX2JhY2soeSk7CiAgICAgICAgaGlzdC5wdXNoX2JhY2soezIsIHJvb3QsIDB9KTsKICAgIH0KCiAgICB2b2lkIHVuaXRlKGludCBhLCBpbnQgYiwgdWxsIHcpIHsKICAgICAgICBhdXRvIGZhID0gZmluZChhKSwgZmIgPSBmaW5kKGIpOwogICAgICAgIGludCByYSA9IGZhLmZpcnN0LCByYiA9IGZiLmZpcnN0OwogICAgICAgIHVsbCB4YSA9IGZhLnNlY29uZCwgeGIgPSBmYi5zZWNvbmQ7CiAgICAgICAgdWxsIGN5YyA9IHhhIF4geGIgXiB3OwoKICAgICAgICBpZiAocmEgPT0gcmIpIHsgYWRkX2Jhc2lzKHJhLCBjeWMpOyByZXR1cm47IH0KCiAgICAgICAgaWYgKHN6W3JhXSA8IHN6W3JiXSkgc3dhcChyYSwgcmIpOwogICAgICAgIGhpc3QucHVzaF9iYWNrKHswLCByYiwgMH0pOwogICAgICAgIHBhcmVudFtyYl0gPSByYTsKICAgICAgICB4b3JQYXJbcmJdID0gY3ljOwoKICAgICAgICBoaXN0LnB1c2hfYmFjayh7MSwgcmEsIHN6W3JiXX0pOwogICAgICAgIHN6W3JhXSArPSBzeltyYl07CgogICAgICAgIGZvciAodWxsIHYgOiBiYXNpc1tyYl0pIGFkZF9iYXNpcyhyYSwgdik7CiAgICB9CgogICAgdm9pZCByb2xsYmFjayhzaXplX3QgY2hlY2twb2ludCkgewogICAgICAgIHdoaWxlIChoaXN0LnNpemUoKSA+IGNoZWNrcG9pbnQpIHsKICAgICAgICAgICAgQ2hhbmdlIGMgPSBoaXN0LmJhY2soKTsgaGlzdC5wb3BfYmFjaygpOwogICAgICAgICAgICBpZiAoYy5raW5kID09IDIpICAgICAgYmFzaXNbYy52XS5wb3BfYmFjaygpOwogICAgICAgICAgICBlbHNlIGlmIChjLmtpbmQgPT0gMSkgc3pbYy52XSAtPSBjLmRlbHRhOwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGludCB2ID0gYy52OwogICAgICAgICAgICAgICAgcGFyZW50W3ZdID0gdjsKICAgICAgICAgICAgICAgIHhvclBhclt2XSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn07CgpzdHJ1Y3QgRWRnZSB7CiAgICBpbnQgdSwgdjsKICAgIHVsbCB3OwogICAgaW50IHJlZDsKICAgIGludCBsLCByOwp9OwpzdHJ1Y3QgU2VnVHJlZSB7CiAgICBpbnQgUTsKICAgIHZlY3Rvcjx2ZWN0b3I8RWRnZT4+IGJ1Y2tldDsKICAgIFNlZ1RyZWUoaW50IF9RKTogUShfUSksIGJ1Y2tldCg0Kl9RKzQpIHt9CiAgICB2b2lkIGFkZChpbnQgbm9kZSxpbnQgTCxpbnQgUixpbnQgcWwsaW50IHFyLGNvbnN0IEVkZ2UmIGUpewogICAgICAgIGlmIChxciA8IEwgfHwgUiA8IHFsKSByZXR1cm47CiAgICAgICAgaWYgKHFsIDw9IEwgJiYgUiA8PSBxcil7IGJ1Y2tldFtub2RlXS5wdXNoX2JhY2soZSk7IHJldHVybjsgfQogICAgICAgIGludCBtaWQ9KEwrUik+PjE7CiAgICAgICAgYWRkKG5vZGU8PDEsIEwsIG1pZCwgcWwsIHFyLCBlKTsKICAgICAgICBhZGQobm9kZTw8MXwxLCBtaWQrMSwgUiwgcWwsIHFyLCBlKTsKICAgIH0KfTsKCnVsbCByZWR1Y2Vfd2l0aF9iYXNpcyhjb25zdCB2ZWN0b3I8dWxsPiYgQiwgdWxsIHgpewogICAgdWxsIGFucyA9IHg7CiAgICBmb3IgKHVsbCBiOiBCKSBhbnMgPSBtaW4oYW5zLCBhbnMgXiBiKTsKICAgIHJldHVybiBhbnM7Cn0KCnN0cnVjdCBPcCB7CiAgICBpbnQgdHlwZTsKICAgIGludCB1LCB2LCBwOwp9OwoKaW50IG1haW4oKXsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUobnVsbHB0cik7CgogICAgaW50IE4sIE0wLCBROwogICAgaWYoIShjaW4gPj4gTiA+PiBNMCA+PiBRKSkgcmV0dXJuIDA7CgogICAgY29uc3QgaW50IE9GRiA9IE47CiAgICBhdXRvIGlkID0gWyZdKGludCB2LGludCBwYXIpeyByZXR1cm4gdiArIHBhcipPRkY7IH07CgogICAgdmVjdG9yPEVkZ2U+IGludGVydmFsczsgaW50ZXJ2YWxzLnJlc2VydmUoTTAgKyBRKTsKCiAgICBmb3IgKGludCBpPTA7aTxNMDsrK2kpewogICAgICAgIGludCB1LHYsYzsgdWxsIHc7IGNpbiA+PiB1ID4+IHYgPj4gdyA+PiBjOwogICAgICAgIGludGVydmFscy5wdXNoX2JhY2soe3Usdix3LChjPT0wKSwgMSwgUX0pOwogICAgfQoKICAgIHN0cnVjdCBJbnNlcnREYXRheyBpbnQgdSx2LHJlZCx0aW1lOyB1bGwgdzsgfTsKICAgIHVub3JkZXJlZF9tYXA8aW50LEluc2VydERhdGE+IGFjdGl2ZTsgYWN0aXZlLnJlc2VydmUoUSoyKTsKICAgIGludCBuZXh0SWQgPSAxOwoKICAgIHZlY3RvcjxPcD4gb3BzKFErMSk7CgogICAgZm9yKGludCB0PTE7dDw9UTsrK3QpewogICAgICAgIGludCB0cDsgY2luID4+IHRwOwogICAgICAgIGlmKHRwPT0xKXsKICAgICAgICAgICAgaW50IHUsdixwOyBjaW4gPj4gdSA+PiB2ID4+IHA7CiAgICAgICAgICAgIG9wc1t0XSA9IHsxLHUsdixwfTsKICAgICAgICB9ZWxzZSBpZih0cD09Mil7CiAgICAgICAgICAgIGludCB1LHYsYzsgdWxsIHc7IGNpbiA+PiB1ID4+IHYgPj4gdyA+PiBjOwogICAgICAgICAgICBhY3RpdmVbbmV4dElkXSA9IHt1LHYsKGM9PTApLHQsd307CiAgICAgICAgICAgIG9wc1t0XSA9IHsyLDAsMCwwfTsKICAgICAgICAgICAgKytuZXh0SWQ7CiAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIGludCBpZGQ7IGNpbiA+PiBpZGQ7CiAgICAgICAgICAgIGF1dG8gaXQgPSBhY3RpdmUuZmluZChpZGQpOwogICAgICAgICAgICBhdXRvIGQgID0gaXQtPnNlY29uZDsgYWN0aXZlLmVyYXNlKGl0KTsKICAgICAgICAgICAgaW50ZXJ2YWxzLnB1c2hfYmFjayh7ZC51LGQudixkLncsZC5yZWQsIGQudGltZSwgdC0xfSk7CiAgICAgICAgICAgIG9wc1t0XSA9IHszLDAsMCwwfTsKICAgICAgICB9CiAgICB9CiAgICBmb3IoYXV0byAma3Y6IGFjdGl2ZSl7CiAgICAgICAgYXV0byAmZCA9IGt2LnNlY29uZDsKICAgICAgICBpbnRlcnZhbHMucHVzaF9iYWNrKHtkLnUsZC52LGQudyxkLnJlZCwgZC50aW1lLCBRfSk7CiAgICB9CgogICAgU2VnVHJlZSBzZWcoUSk7CiAgICBmb3IoY29uc3QgRWRnZSYgZTogaW50ZXJ2YWxzKQogICAgICAgIGlmKGUubDw9ZS5yKSBzZWcuYWRkKDEsMSxRLGUubCxlLnIsZSk7CgogICAgRFNVIGRzdSgyKk4pOwogICAgdmVjdG9yPHVsbD4gYW5zd2VyczsgYW5zd2Vycy5yZXNlcnZlKFEpOwoKICAgIGZ1bmN0aW9uPHZvaWQoaW50LGludCxpbnQpPiBkZnMgPSBbJl0oaW50IG5vZGUsaW50IEwsaW50IFIpewogICAgICAgIHNpemVfdCBjcCA9IGRzdS5oaXN0LnNpemUoKTsKICAgICAgICBmb3IoY29uc3QgRWRnZSYgZSA6IHNlZy5idWNrZXRbbm9kZV0pewogICAgICAgICAgICBpbnQgciA9IGUucmVkOwogICAgICAgICAgICBkc3UudW5pdGUoaWQoZS51LDApLCBpZChlLnYsciksIGUudyk7CiAgICAgICAgICAgIGRzdS51bml0ZShpZChlLnUsMSksIGlkKGUudixyXjEpLCBlLncpOwogICAgICAgIH0KCiAgICAgICAgaWYoTD09Uil7CiAgICAgICAgICAgIGNvbnN0IE9wJiBvcCA9IG9wc1tMXTsKICAgICAgICAgICAgaWYob3AudHlwZT09MSl7CiAgICAgICAgICAgICAgICBpbnQgdTAgPSBpZChvcC51LDApOwogICAgICAgICAgICAgICAgaW50IHZwID0gaWQob3AudixvcC5wKTsKCiAgICAgICAgICAgICAgICBhdXRvIGZ1ID0gZHN1LmZpbmQodTApOwogICAgICAgICAgICAgICAgYXV0byBmdiA9IGRzdS5maW5kKHZwKTsKCiAgICAgICAgICAgICAgICB1bGwgcmF3ID0gZnUuc2Vjb25kIF4gZnYuc2Vjb25kOwogICAgICAgICAgICAgICAgdWxsIGFucyA9IHJlZHVjZV93aXRoX2Jhc2lzKGRzdS5iYXNpc1tmdS5maXJzdF0sIHJhdyk7CiAgICAgICAgICAgICAgICBhbnN3ZXJzLnB1c2hfYmFjayhhbnMpOwogICAgICAgICAgICB9CiAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIGludCBtaWQ9KEwrUik+PjE7CiAgICAgICAgICAgIGRmcyhub2RlPDwxLCBMLCBtaWQpOwogICAgICAgICAgICBkZnMobm9kZTw8MXwxLCBtaWQrMSwgUik7CiAgICAgICAgfQogICAgICAgIGRzdS5yb2xsYmFjayhjcCk7CiAgICB9OwogICAgZGZzKDEsMSxRKTsKCiAgICBmb3IodWxsIHg6IGFuc3dlcnMpIGNvdXQgPDwgeCA8PCAnXG4nOwogICAgcmV0dXJuIDA7Cn0K