Cod sursa(job #2923514)

Utilizator EasyTnsEasyTns EasyTns Data 15 septembrie 2022 09:59:34
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include<fstream>
#include <iostream>
#include<vector>
using namespace std;
ofstream fout("disjoint.out");
class inparser{
 vector<char>str;
 int ptr;
 ifstream fin;
 char getchar()
 {
     if(ptr==int(str.size()))
     {
         fin.read(str.data(),str.size());
         ptr=0;
     }
     return str[ptr++];
 }

    template<class T>
            T getint()
    {
     char chr=getchar();
     if(!isdigit(chr)&&chr!='-')
         chr=getchar();
     int sgn=+1;
     if(chr=='-')
     {
         sgn=-1;
         chr=getchar();
     }
     T numar=0;
     while(isdigit(chr))
     {
         numar=numar*10+chr-'0';
         chr=getchar();
     }
     return numar*sgn;
    }
public:
    inparser(char *name): str(1e5),ptr(int(str.size())),fin(name){}
    ~inparser(){fin.close();}
    template<class T>
    friend inparser & operator >> (inparser & in,T &numar)
    {
     numar=in.template getint<T>();
     return in;
    }
};
inparser fin("disjoint.in");
int T[1000002],c[100001];
int Radacina(int k){
    if(T[k] == 0)
        return k;
    else
    {


        return T[k] = Radacina(T[k]);;
    }
}

void unite (int x, int y){
    x = Radacina(x);
    y = Radacina(y);
    if (c[x] > c[y]){
        swap(x, y);
    }
    T[y] = x;
    c[x] += c[y];
}

int main() {
int n,m,x,y,z;
fin>>n>>m;
for(int i=1;i<=m;i++)
{
    fin>>x>>y>>z;
    if(x==1)
    {
        if(Radacina(y)!= Radacina(z))
            unite(y,z);
    }
    else
    {
        fout<<(Radacina(y)==Radacina(z)?"DA\n":"NU\n");
    }
}
}