Cod sursa(job #1799160)

Utilizator vladbatalanBatalan Vlad vladbatalan Data 5 noiembrie 2016 20:53:01
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
#include <stack>

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

int n,m,v[100010],op,x,y;
stack<int> q;

void grupeaza(int a, int b) {
    while(v[a]!=0) {
        q.push(a);
        a=v[a];
    }
    while(!q.empty()) {
        v[q.top()]=a;
        q.pop();
    }
    while(v[b]!=0) {
        q.push(b);
        b=v[b];
    }
    while(!q.empty()) {
        v[q.top()]=a;
        q.pop();
    }
    v[a]=b;
}
void verifica(int a, int b) {
    while(v[a]!=0){
        q.push(a);
        a=v[a];
    }
    while(!q.empty())
    {
        v[q.top()]=a;
        q.pop();
    }
    while(v[b]!=0){
        q.push(b);
        b=v[b];
    }
    while(!q.empty())
    {
        v[q.top()]=b;
        q.pop();
    }
    if(a==b)fout<<"DA\n";
    else {
        fout<<"NU\n";
    }
}
int main() {
    fin>>n>>m;
    while(m--) {
        fin>>op>>x>>y;
        switch(op) {
        case 1:
            grupeaza(x,y);
            break;
        case 2:
            verifica(x,y);
            break;
        }
    }



    return 0;
}