Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define FAST_IO ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)
- #define setIO(i, o) freopen(i, "r", stdin), freopen(o, "w", stdout)
- #define pb push_back
- #define eb emplace_back
- #define all(x) (x).begin(), (x).end()
- #define rall(x) (x).rbegin(), (x).rend()
- #define sz(x) (int) (x).size()
- #define lc(i) 2*i
- #define rc(i) 2*i+1
- //#define int long long
- using namespace std;
- using ll = long long;
- using ii = pair<int, int>;
- using vii = vector<ii>;
- using vi = vector<int>;
- using vvi = vector<vi>;
- using vb = vector<bool>;
- using vvb = vector<vb>;
- const int N = 2e5 + 5, MOD = 1e9 + 7, INF = 1e9 + 5;
- struct DSU {
- int n;
- vector<int> par, s, delta, deltaRoot;
- vector<int> g[N];
- void init(int x) {
- n = x;
- par.resize(n);
- iota(all(par), 0);
- s.assign(n, 1);
- delta.assign(n, 0);
- deltaRoot.assign(n, 0);
- }
- void mark(int x, int newPar) {
- delta[x] += deltaRoot[par[x]] - deltaRoot[newPar];
- par[x] = newPar;
- for (const auto &v : g[x])
- if (par[v] != newPar)
- mark(v, newPar);
- }
- void unite(int x, int y) {
- x = par[x];
- y = par[y];
- if (x == y) return;
- g[x].pb(y);
- g[y].pb(x);
- if (s[x] > s[y]) swap(x, y);
- mark(x, y);
- s[y] += s[x];
- }
- int get(int x) {
- return delta[x] + deltaRoot[par[x]];
- }
- void add(int x, int v) {
- x = par[x];
- deltaRoot[x] += v;
- }
- };
- signed main() {
- FAST_IO;
- #ifdef arujbansal_local
- setIO("input.txt", "output.txt");
- #endif
- int n, q;
- cin >> n >> q;
- DSU players;
- players.init(n);
- while (q--) {
- string query;
- cin >> query;
- if (query == "join") {
- int x, y;
- cin >> x >> y;
- x--, y--;
- players.unite(x, y);
- } else if (query == "add") {
- int x, v;
- cin >> x >> v;
- x--;
- players.add(x, v);
- } else {
- int x;
- cin >> x;
- x--;
- cout << players.get(x) << "\n";
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement