Cod sursa(job #1817364)

Utilizator retrogradLucian Bicsi retrograd Data 27 noiembrie 2016 18:09:23
Problema Paduri de multimi disjuncte Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <bits/stdc++.h>

using namespace std;

namespace TreapOps {
    const int kMaxNodes = 500000;
    
    struct TreapNode {
        TreapNode *l, *r, *parent;
        int priority;
    };
    typedef TreapNode* TreapIter;
    TreapNode buff[kMaxNodes];
    TreapIter nill = buff;
    int nodes;
    
    TreapIter CreateSingleton() {
        TreapIter ret = buff + (++nodes);
        ret->l = ret->r = ret->parent = nill;
        ret->priority = rand();
        return ret;
    }
    TreapIter Join(TreapIter l, TreapIter r) {
        if(l == nill) return r;
        if(r == nill) return l;
        
        TreapIter ret = nill;
        if(l->priority > r->priority) {
            l->r = Join(l->r, r);
            ret = l;
        } else {
            r->l = Join(l, r->l);
            ret = r;
        }
        ret->l->parent = ret->r->parent = ret;
        return ret;
    }
    TreapIter GetRoot(TreapIter it) {
        while(it->parent != nill)
            it = it->parent;
        return it;
    }
};
using namespace TreapOps;

int main() {
    freopen("disjoint.in", "r", stdin);
    freopen("disjoint.out", "w", stdout);
    
    srand(time(0));
    int n, m;
    cin >> n >> m;
    
    vector<TreapIter> V(n);
    for(int i = 0; i < n; ++i)
        V[i] = CreateSingleton();
        
    while(m--) {
        int op, a, b;
        cin >> op >> a >> b;
        
        auto it1 = GetRoot(V[a - 1]);
        auto it2 = GetRoot(V[b - 1]);
        
        if(op == 1) {
            if(it1 != it2) 
                Join(it1, it2);
        } else {
            cout << ((it1 == it2) ? "DA\n" : "NU\n");
        }
    }
    
    return 0;
}