Cod sursa(job #2977198)

Utilizator rastervcrastervc rastervc Data 11 februarie 2023 08:51:39
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.05 kb
#include <fstream>
#include <vector>

using namespace std;

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");
ofstream fout("disjoint.out");

constexpr size_t LIM = 1e5 + 1;
int F[LIM];

static inline int get_root(int node) {
    int aux = node;
    while (F[node] > 0)
        node = F[node];
    int root = node;
    node = aux;
    while (node != root) {
        aux = F[node];
        F[node] = root;
        node = aux;
    }
    return root;
}

static inline void join(int node1, int node2) {
    int root1 = get_root(node1);
    int root2 = get_root(node2);

    if (root1 == root2) return;

    if (F[root1] <= F[root2]) {
        F[root1] += F[root2];
        F[root2] = root1;
    } else {
        F[root2] += F[root1];
        F[root1] = root2;
    }
}

static inline bool query(int node1, int node2) {
    return get_root(node1) == get_root(node2);
}

int N, M, op, node1, node2, i;

int main() {
    fin >> N >> M;
    for (i = 1; i <= M; ++i) {
        fin >> op >> node1 >> node2;
        if (op == 1) join(node1, node2);
        else {
            if (query(node1, node2)) fout << "DA\n";
            else fout << "NU\n";
        }
    }
    fout.close();
    return 0;
}