boolins(int x)//插入 { for (int i = 30; i >= 0; i--) if (x&(1 << i)) { if (!b[i]) { b[i] = x; len++; break; } x ^= b[i]; } return x > 0; }
intMax(int res)//所有可能异或中最大 { for (int i = 30; i >= 0; i--) res = max(res, res^b[i]); return res; }
intMin(int res)//所有可能异或中最小 { for (int i = 30; i >= 0; i--) res = min(res, res^b[i]); return res; }
} LB; int n, m, q; structE { int v, w; }; vector<E>G[N]; int d[N], vis[N]; voiddfs(int u, int _fa){ vis[u] = 1; for (E& e : G[u]) { int v = e.v, w = e.w; if (vis[v])LB.ins(d[v] ^ d[u] ^ w); else { d[v] = (d[u] ^ w); dfs(v, u); } } } int sum[N]; intmain(){ scanf("%d%d%d", &n, &m, &q); for (int i = 1; i <= m; i++) { int u, v, w; scanf("%d%d%d", &u, &v, &w); G[u].push_back({ v,w }); G[v].push_back({ u,w }); } dfs(1, 0); for (int i = 1; i <= n; i++)sum[i] = (sum[i - 1] ^ d[i]); while (q--) { int l, r; scanf("%d%d", &l, &r); int ans = 0; if ((r - l) & 1)ans = (sum[r] ^ sum[l - 1]); if (1ll * (r - l + 1)*(r - l) / 2 % 2 == 0) { ans = LB.Min(ans); } else ans = LB.Max(ans); printf("%d\n",ans); } return0; }