Cod sursa(job #2779429)

Utilizator smunteanuMunteanu Stefan Catalin smunteanu Data 3 octombrie 2021 18:30:29
Problema Paduri de multimi disjuncte Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.93 kb
#include <iostream>
#include <fstream>
#define endl '\n'
using namespace std;

struct Node {
  int rnk;
  Node *prt;
};

static int N, M;
static Node *A[100001];
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");

void makeSet(int p) {
  Node *cur = new Node;
  cur->prt = cur;
  cur->rnk = 0;
  A[p] = cur;
}

Node* findSet(Node *p) {
  while (p != p->prt)
    p = p->prt;
  return p;
}

void unite(Node *a, Node *b) {
  a = findSet(a);
  b = findSet(b);
  if (a != b) {
    if (a->rnk > b->rnk) {
      b->prt = a;
      a->rnk = b->rnk+1;
    } else {
      a->prt = b;
      b->rnk = a->rnk+1;
    }
  }
}

int main() {
  fin >> N >> M;
  for (int i=1; i<=N; i++)
    makeSet(i);
  for (int i=0; i<M; i++) {
    int c, x, y;
    fin >> c >> x >> y;
    if (c == 1) {
      unite(A[x], A[y]);
    } else {
      fout << (findSet(A[x]) == findSet(A[y]) ? "DA" : "NU") << endl;
    }
  }
}