#include #include #include #include #include #include #include #include #include #define vll vector #define vvvl vector #define vvl vector> #define VV(a, b, c, d) vector >(a, vector(b, c)) #define VVV(a, b, c, d) vector(a, vvl(b, vll (c, d))); #define re(c, b) for(ll c=0;c; using Graph = std::vector; using Array = std::vector; using Matrix = std::vector; std::pair, Edges> bridge(const Graph& g) { const int n = g.size(); int idx = 0, s = 0, t = 0, k = 0; std::vector ord(n, -1), onS(n), stk(n), roots(n), cmp(n); Edges brdg; std::function dfs = [&](int v, int u) { ord[v] = idx++; stk[s++] = v; onS[v] = true; roots[t++] = v; for (auto& e : g[v]) { int w = e.dst; if (ord[w] == -1) dfs(w, v); else if (u != w && onS[w]) while (ord[roots[t - 1]] > ord[w]) --t; } if (v == roots[t - 1]) { brdg.emplace_back(u, v, 0); while (1) { int w = stk[--s]; onS[w] = false; cmp[w] = k; if (v == w) break; } --t; ++k; } }; for (int u = 0; u < n; u++) { if (ord[u] == -1) { dfs(u, n); brdg.pop_back(); } } return std::make_pair(cmp, brdg); } #define SIZE 100001 template< typename G > struct HeavyLightDecomposition { G &g; vector< int > sz, in, out, head, rev, par; HeavyLightDecomposition(G &g) : g(g), sz(SIZE), in(SIZE), out(SIZE), head(SIZE), rev(SIZE), par(SIZE) {} void dfs_sz(int idx, int p) { par[idx] = p; sz[idx] = 1; if(g[idx].size() && g[idx][0] == p) swap(g[idx][0], g[idx].back()); for(auto &to : g[idx]) { if(to == p) continue; dfs_sz(to, idx); sz[idx] += sz[to]; if(sz[g[idx][0]] < sz[to]) swap(g[idx][0], to); } } void dfs_hld(int idx, int par, int ×) { in[idx] = times++; rev[in[idx]] = idx; for(auto &to : g[idx]) { if(to == par) continue; head[to] = (g[idx][0] == to ? head[idx] : to); dfs_hld(to, idx, times); } out[idx] = times; } void build() { dfs_sz(0, -1); int t = 0; dfs_hld(0, -1, t); } int la(int v, int k) { while(1) { int u = head[v]; if(in[v] - k >= in[u]) return rev[in[v] - k]; k -= in[v] - in[u] + 1; v = par[u]; } } int lca(int u, int v) { for(;; v = par[head[v]]) { if(in[u] > in[v]) swap(u, v); if(head[u] == head[v]) return u; } } template< typename T, typename Q, typename F > T query(int u, int v, const T &ti, const Q &q, const F &f, bool edge = false) { T l = ti, r = ti; for(;; v = par[head[v]]) { if(in[u] > in[v]) swap(u, v), swap(l, r); if(head[u] == head[v]) break; l = f(q(in[head[v]], in[v] + 1), l); } return f(f(q(in[u] + edge, in[v] + 1), l), r); // return {f(q(in[u] + edge, in[v] + 1), l), r}; } template< typename Q > void add(int u, int v, const Q &q, bool edge = false) { for(;; v = par[head[v]]) { if(in[u] > in[v]) swap(u, v); if(head[u] == head[v]) break; q(in[head[v]], in[v] + 1); } q(in[u] + edge, in[v] + 1); } }; //------------------------------------------------------------------- struct segtree{ ll M=1, INIT; vector dat; segtree(ll N, ll num){ INIT = num; while(M0) k = (k-1)/2, dat[k] = max(dat[k*2+1],dat[k*2+2]); } ll query(ll a, ll b=-1, ll k=0, ll l=0, ll r=-1){ if(r==-1) r = M; if(b==-1) b = M; if(r<=a || b<=l) return INIT; if(a<=l && r<=b) return dat[k]; ll A = query(a, b, k*2+1, l, (l+r)/2); ll B = query(a, b, k*2+2, (l+r)/2, r); return max(A, B); } }; //------------------------------------------------------------------- #include int main(int argc, char const *argv[]) { ll a, b, c, n, m, q;std::cin >> n >> m >> q; Graph G(SIZE); re(i, m){ scanf("%lld %lld", &a, &b); G[a-1].push_back(Edge(a-1, b-1, 1)); G[b-1].push_back(Edge(b-1, a-1, 1)); } auto w = bridge(G); vector cmp = w.first; vector> T(SIZE, vector()); for(auto e:w.second){ int from = cmp[e.src]; int to = cmp[e.dst]; T[from].push_back(to); T[to].push_back(from); } HeavyLightDecomposition>> hld(T); hld.build(); segtree seg(SIZE, -1); vector> max_cost(SIZE); ll f = 1000000; re(i, q){ scanf("%lld %lld %lld", &a, &b, &c); if(a==1){ b = cmp[b-1]; max_cost[b].push(c); ll MAX = max_cost[b].top(); hld.add(b, b, [&](ll x, ll y){seg.update(MAX*f+b, x);}); }else{ b = cmp[b-1]; c = cmp[c-1]; ll q = hld.query(b, c, -1, [&](ll x, ll y){return seg.query(x, y);}, [&](ll x, ll y){return max(x, y);} ); if(q==-1) printf("-1\n"); if(q!=-1) { printf("%lld\n", q/f); ll to = q%f; max_cost[to].pop(); ll MAX = (!max_cost[to].empty()?max_cost[to].top():-1); hld.add(to, to, [&](ll x, ll y){seg.update(MAX*f+to, x);}); } } } return 0; }