Cod sursa(job #3193357)

Utilizator vladdobro07vladdd vladdobro07 Data 14 ianuarie 2024 14:58:37
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.95 kb
#include <bits/stdc++.h>
#include <cstdlib>
#include <ctime>
#pragma GCC optimize("Ofast,unroll-loops")
#pragma GCC target("avx2")
#define UNI 1
#define CHK 2
using namespace std;
const int nmax=1e5;
struct DSU {
  int n;
  vector<int>f;
  DSU(int sz) {
    n=sz;
    f.resize(sz+1);
    for(int i=1;i<=sz;i++)
      f[i]=i;
  }
  int find(int x){
    if(f[x]==x)
      return x;
    return f[x]=find(f[x]);
  }
  void join(int x,int y) {
    if(x==y)
      return;
    int sx=find(x),sy=find(y);
    if(sx>sy)
      swap(sx,sy);
    if(sx==sy)
      return;
    f[sx]=sy;
  }
};
int main() {
  ifstream cin("disjoint.in");
  ofstream cout("disjoint.out");
  srand(time(NULL));
  int n,q,cer,x,y;
  cin>>n>>q;
  DSU myDsu(n);
  for(int i=1;i<=q;i++){
    cin>>cer>>x>>y;
    if(cer==UNI){
      myDsu.join(x,y);
    } else if(cer==CHK){
      cout<<((myDsu.find(x)==myDsu.find(y))?"DA\n":"NU\n");
    }
  }
  return 0;
}