Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <vector>
- #include <stack>
- #include <queue>
- #include <algorithm>
- #include <ctime>
- using namespace std;
- const int MAXN = 1111111, MAXQ = 2222222;
- int n, q;
- int type[MAXQ], v1[MAXQ], v2[MAXQ], comple[MAXQ];
- int *u[MAXQ];
- int k[MAXQ];
- int parent[MAXN], sz[MAXN];
- int *pointers[2 * MAXQ], values[2 * MAXQ];
- int cnt = 0;
- int findSet(int v) {
- if (parent[v] == v) {
- return v;
- } else {
- return findSet(parent[v]);
- }
- }
- void join(int v1, int v2) {
- int s1 = findSet(v1), s2 = findSet(v2);
- if (s1 != s2) {
- if (sz[s2] > sz[s1]) {
- swap(s1, s2);
- }
- pointers[cnt] = &parent[s2];
- values[cnt] = parent[s2];
- cnt++;
- parent[s2] = s1;
- pointers[cnt] = &sz[s1];
- values[cnt] = sz[s1];
- cnt++;
- sz[s1] += sz[s2];
- }
- }
- void decompose(int l, int r) {
- if (l == r) {
- if (type[l] == 3) {
- vector<int> sorted(k[l]);
- for (int i = 0; i < k[l]; i++) {
- sorted[i] = findSet(u[l][i]);
- }
- sort(sorted.begin(), sorted.end());
- int sumsize = 0;
- int len = sorted.size();
- for (int i = 0; i < len; ) {
- int j = i;
- while (j < len && sorted[j] == sorted[i]) {
- j++;
- }
- sumsize += sz[sorted[i]];
- i = j;
- }
- if (sumsize == len) {
- puts("YES");
- } else {
- puts("NO");
- }
- }
- } else {
- int m = (l + r) / 2;
- int startcnt = cnt;
- for (int i = m + 1; i <= r; i++) {
- if (type[i] == 2 && comple[i] < l) {
- int from = v1[comple[i]], to = v2[comple[i]];
- join(from, to);
- }
- }
- decompose(l, m);
- while (cnt > startcnt) {
- *pointers[cnt - 1] = values[cnt - 1];
- cnt--;
- }
- for (int i = l; i <= m; i++) {
- if (type[i] == 1 && comple[i] > r) {
- int from = v1[i], to = v2[i];
- join(from, to);
- }
- }
- decompose(m + 1, r);
- while (cnt > startcnt) {
- *pointers[cnt - 1] = values[cnt - 1];
- cnt--;
- }
- }
- }
- int main() {
- scanf("%d %d", &n, &q);
- for (int i = 0; i < n; i++) {
- parent[i] = i;
- sz[i] = 1;
- }
- vector<int> addTime(q);
- int addCnt = 0;
- for (int i = 0; i < q; i++) {
- scanf("%d", &type[i]);
- if (type[i] == 1) {
- scanf("%d %d", &v1[i], &v2[i]);
- v1[i]--;
- v2[i]--;
- comple[i] = q;
- addTime[addCnt++] = i;
- } else if (type[i] == 2) {
- int m;
- scanf("%d", &m);
- m--;
- comple[i] = addTime[m];
- comple[addTime[m]] = i;
- } else {
- scanf("%d", &k[i]);
- u[i] = new int[k[i]];
- for (int j = 0; j < k[i]; j++) {
- int val;
- scanf("%d", &val);
- val--;
- u[i][j] = val;
- }
- }
- }
- decompose(0, q - 1);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement