Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #include <ext/pb_ds/assoc_container.hpp>
- #include <ext/pb_ds/tree_policy.hpp>
- using namespace __gnu_pbds;
- typedef long long ll;
- typedef long double ld;
- typedef vector<int> vi;
- typedef vector<ll> vl;
- typedef pair<int, int> pii;
- typedef pair<ll, ll> pll;
- typedef map<int, int> mii;
- typedef unordered_map<int, int> umii;
- typedef map<ll, ll> mll;
- typedef unordered_map<ll, ll> umll;
- typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
- // struct Node
- // {
- // int node, len;
- // Node() {node = len = 0;}
- // Node(int node, int len) {this -> node = node, this -> len = len;}
- // };
- // typedef vector<Node> vg;
- #define MAX 2000001
- #define MOD 1000000007
- #define fi first
- #define se second
- #define pf push_front
- #define pb push_back
- #define FOR(type, i, a, b) for(type i = (a); i <= (b); i++)
- #define FORR(type, i, b, a) for(type i = (b); i >= (a); i--)
- #define testBit(n, bit) ((n >> bit) & 1)
- #define flipBit(n, bit) (n ^ (1ll << bit))
- #define cntBit(n) __builtin_popcount(n)
- #define cntBitll(n) __builtin_popcountll(n)
- #define randomize mt19937_64 mt(chrono::steady_clock::now().time_since_epoch().count());
- struct Comp
- {
- int num, ver;
- Comp() {num = ver = 0;}
- Comp(int num, int ver) {this -> num = num, this -> ver = ver;}
- };
- int n, m;
- int ver[MAX];
- int pos[MAX];
- Comp value[MAX];
- bool match[MAX] = {};
- int dsu[MAX], len;
- int findRoot(int node){
- if (dsu[node] < 0) return node;
- dsu[node] = findRoot(dsu[node]);
- return dsu[node];
- }
- int join(int u, int v){
- u = findRoot(u), v = findRoot(v);
- if (u == v) return u;
- if (dsu[u] > dsu[v]) swap(u, v);
- dsu[u] += dsu[v]; dsu[v] = u;
- return u;
- }
- void transfer(int a, int b){
- int verA = ver[a], verB = ver[b];
- int posA = pos[a], posB = pos[b];
- // cerr << "A - ver:" << verA << ", pos:" << posA << '\n';
- // cerr << "B - ver:" << verB << ", pos:" << posB << '\n';
- if (match[posA]) return;
- match[posA] = true;
- // cerr << "A matched.\n";
- if (match[posB]){
- // cerr << "B had matched, finding a new one...\n";
- len++; ver[b]++, verB++;
- value[len] = {b, verB};
- posB = pos[b] = len;
- }
- int root = join(posA, posB);
- value[root] = {b, verB};
- }
- Comp get(int node){
- return value[findRoot(node)];
- }
- main()
- {
- ios_base::sync_with_stdio(0); cin.tie(0);
- cin >> n >> m;
- // memset(dsu, sizeof(dsu), -1);
- fill(dsu, dsu + MAX, -1);
- // /*check: */ cerr << "ok: " << (dsu[30] == -1) << ' ' << (dsu[1516] == -1) << '\n';
- FOR(int, i, 1, n) ver[i] = 1, pos[i] = i, value[i] = {i, 1}; len = n;
- FOR(int, _, 1, m){
- char q; cin >> q;
- if (q == 'E'){
- int a, b; cin >> a >> b;
- transfer(a, b);
- } else {
- int x; cin >> x;
- // Comp ohdear = get(x);
- // cout << "ans: " << ohdear.num << ' ' << ohdear.ver<< '\n';
- cout << get(x).num << '\n';
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement