Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const int MAXN = (int)3e5 + 7;
- const int INF = (int)1e9 + 7;
- const ll LINF = (ll)6e18 + 7;
- int n, k, ans, vl;
- map <pii, vpii> q;
- vpii t[4 * MAXN];
- int tim, pos;
- map<int, int> qrs;
- int r[MAXN], p[MAXN];
- vpii sp, sr;
- int L, R;
- pii val;
- void update_edge(int v, int tl, int tr)
- {
- if (tl > R || tr < L)
- return;
- if (L <= tl && tr <= R)
- {
- t[v].inb(val);
- return;
- }
- int tm = tl + tr >> 1;
- if (tm >= L)
- update_edge(2 * v + 1, tl, tm);
- if (tm + 1 <= R)
- update_edge(2 * v + 2, tm + 1, tr);
- }
- int dsu_get(int x)
- {
- if (p[x] == x)
- return x;
- return dsu_get(p[x]);
- }
- int dsu_unit(int a, int b)
- {
- a = dsu_get(a);
- b = dsu_get(b);
- if (a != b)
- {
- --ans;
- if (r[a] < r[b])
- swap(a, b);
- sr.inb(mk(a, r[a]));
- sp.inb(mk(b, p[b]));
- r[a] += r[b];
- p[b] = a;
- return 1;
- }
- return 0;
- }
- void dsu_back()
- {
- r[sr.back().X] = sr.back().Y;
- p[sp.back().X] = sp.back().Y;
- ++ans;
- sr.outb(), sp.outb();
- }
- void dfs(int v, int tl, int tr)
- {
- int cnt = 0;
- for (auto &edge : t[v])
- cnt += dsu_unit(edge.X, edge.Y);
- if (tl != tr)
- {
- int tm = tl + tr >> 1;
- dfs(2 * v + 1, tl, tm);
- dfs(2 * v + 2, tm + 1, tr);
- }
- else
- {
- for (int i = 0; i < qrs[tl]; ++i)
- printf("%d\n", ans);
- }
- for (int i = 0; i < cnt; ++i)
- dsu_back();
- }
- int solve()
- {
- scanf("%d %d", &n, &k);
- ans = n;
- for (int i = 0; i < n; ++i)
- p[i] = i;
- for (int i = 0; i < k; ++i)
- {
- char cmd;
- scanf(" %c", &cmd);
- if (cmd == '?')
- {
- if (tim == 0)
- printf("%d\n", ans);
- else
- ++qrs[tim];
- }
- else
- {
- int a, b;
- scanf("%d %d", &a, &b);
- --a, --b;
- if (a > b)
- swap(a, b);
- if (cmd == '+')
- {
- q[mk(a, b)].inb(mk(tim, -1));
- }
- else
- {
- q[mk(a, b)].back().Y = tim;
- }
- }
- ++tim;
- }
- for (auto &Q : q)
- {
- val = Q.X;
- for (auto &lr : Q.Y)
- {
- L = lr.X;
- R = lr.Y;
- if (R == -1)
- R = tim;
- update_edge(0, 0, tim);
- }
- }
- dfs(0, 0, tim);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement