Cod sursa(job #2797140)

Utilizator andrei_C1Andrei Chertes andrei_C1 Data 9 noiembrie 2021 12:40:48
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 4.69 kb
#include <fstream>
#include <algorithm>
//#include <string>

//class InParser {
//private :
//    FILE *fin;
//    char *buf;
//    const int lim = 1 << 16;
//    int pos;
//
//    inline void next() {
//        if(++pos == lim){
//            fread(buf, 1, lim, fin);
//            pos = 0;
//        }
//    }
//public :
//    InParser (const char *file_name){
//        fin = fopen(file_name, "r");
//        pos = lim - 1;
//        buf = new char[lim]();
//    }
//
//    InParser& operator >> (char &x){
//        x = buf[pos];
//        next();
//        return *this;
//    }
//
//    InParser& operator >> (char *x) {
//        for(int i = 0; buf[pos] > 32; i++, next()) {
//            x[i] = buf[pos];
//        }
//        return *this;
//    }
//
////    InParser& operator >> (std :: string &x) {
////        x = "";
////        for(; buf[pos] < ' '; next());
////        for(; buf[pos] > ' '; next()) {
////            x.push_back(buf[pos]);
////        }
////        x[x.size()] = '\0';
////        return *this;
////    }
//
//    InParser& operator >> (int &x){
//        x = 0;
//        int sgn = 1;
//
//        for(; buf[pos] < '0' || buf[pos] > '9'; next()){
//            if(buf[pos]=='-'){
//                sgn = -1;
//            }
//        }
//
//        for(; buf[pos] >= '0' && buf[pos] <= '9'; next()){
//            x = x * 10 + buf[pos] - '0';
//        }
//
//        x *= sgn;
//        return *this;
//    }
//
//    InParser& operator >> (long long &x){
//        x = 0;
//        int sgn = 1;
//
//        for(; buf[pos] < '0' || buf[pos] > '9'; next()){
//            if(buf[pos]=='-'){
//                sgn = -1;
//            }
//        }
//
//        for(; buf[pos] >= '0' && buf[pos] <= '9'; next()){
//            x = x * 10 + buf[pos] - '0';
//        }
//
//        x *= sgn;
//        return *this;
//    }
//};
//
//class OutParser {
//private :
//    FILE *fout;
//    char *buf;
//    const int lim = 1 << 16;
//    int pos;
//
//    inline void put_ch(const char ch) {
//        if (pos == lim) {
//            fwrite(buf, 1, lim, fout);
//            pos = 0;
//            buf[pos++] = ch;
//        } else {
//            buf[pos++] = ch;
//        }
//    }
//public :
//    OutParser (const char *file_name){
//        fout = fopen(file_name, "w");
//        pos = 0;
//        buf = new char[lim]();
//    }
//
//    ~OutParser() {
//        fwrite(buf, 1, pos, fout);
//    }
//
//    OutParser& operator << (int x){
//        if(x < 0) {
//            put_ch('-');
//            x = -x;
//        }
//        if(x == 0) {
//            put_ch('0');
//            return *this;
//        }
//        int i;
//        for(i = 1; i <= x; i *= 10);
//        i /= 10;
//        for(; i > 0; i /= 10) {
//            put_ch((char)(x / i + '0'));
//            x %= i;
//        }
//        return *this;
//    }
//
//    OutParser& operator << (char x){
//        put_ch(x);
//        return *this;
//    }
//
//    OutParser& operator << (const char *x){
//        for(int i = 0; x[i]; i++) {
//            put_ch(x[i]);
//        }
//        return *this;
//    }
////    OutParser& operator << (const std :: string &x){
////        for(int i = 0; i < x[i]; i++) {
////            put_ch(x[i]);
////        }
////        return *this;
////    }
//};

std :: ifstream fin("disjoint.in");
std :: ofstream fout("disjoint.out");

const int NMAX = 1e5;

int M;
int crt_max, N;
int parent[NMAX + 1];
int set_size[NMAX + 1];

void make_set(int node) {
    parent[node] = node;
    set_size[node] = 1;
}

int find_set(int node) {
    if(parent[node] == node) {
        return node;
    }
    return node = find_set(parent[node]);
}

void union_set(int node1, int node2) {
    int set1 = find_set(node1);
    int set2 = find_set(node2);

    if(set1 != set2) {
        if(set_size[set1] < set_size[set2]) {
            parent[set1] = set2;
            set_size[set2] += set_size[set1];
            crt_max = std :: max(crt_max, set_size[set2]);
        } else {
            parent[set2] = set1;
            set_size[set1] += set_size[set2];
            crt_max = std :: max(crt_max, set_size[set1]);
        }
    }
}

int main() {
    fin >> N >> M;

    for(int i = 1; i <= N; i++) {
        make_set(i);
    }

    while(M--) {
        int op, x, y;
        fin >> op >> x >> y;

        if(op == 1) {
            union_set(x, y);
        } else if(op == 2) {
            if(find_set(x) == find_set(y)) {
                fout << "DA\n";
            } else {
                fout << "NU\n";
            }
        }
    }
    return 0;
}