結果

問題 No.2290 UnUnion Find
コンテスト
ユーザー Hydrogen332
提出日時 2025-10-13 13:56:54
言語 C++23
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 191 ms / 2,000 ms
コード長 1,087 bytes
コンパイル時間 3,234 ms
コンパイル使用メモリ 283,792 KB
実行使用メモリ 13,312 KB
最終ジャッジ日時 2025-10-13 13:57:11
合計ジャッジ時間 15,423 ms
ジャッジサーバーID
(参考情報)
judge4 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 46
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define rep(i, s, e) for (int i = (int)(s); i < (int)(e); ++i)

struct UnionFind {
	vector<int> par;
	set<int> leader;
	int group;
	
	UnionFind(int N) : par(N, -1), group(N) {
		rep(i, 0, N) leader.insert(i);
	}
	
	int root(int x) {
		if (par[x] < 0) return x;
		else return par[x] = root(par[x]);
	}
	
	bool merge(int x, int y) {
		if ((x = root(x)) == (y = root(y))) return false;
		if (par[x] > par[y]) swap(x, y);
		par[x] += par[y];
		par[y] = x;
		leader.erase(y);
		--group;
		return true;
	}
	
	bool same(int x, int y) {
		return root(x) == root(y);
	}
};

int main() {
	cin.tie(nullptr);
	ios_base::sync_with_stdio(false);
	
	int N, Q;
	cin >> N >> Q;
	
	UnionFind uf(N);
	
	rep(query, 0, Q) {
		int ord;
		cin >> ord;
		
		if (ord == 1) {
			int u, v;
			cin >> u >> v;
			--u, --v;
			uf.merge(u, v);
		} else {
			int v;
			cin >> v;
			--v;
			
			if (uf.group == 1) cout << -1 << '\n';
			else {
				for (int u : uf.leader) if (!uf.same(v, u)) {
					cout << u + 1 << '\n';
					break;
				}
			}
		}
	}
}
0